popnoire/site/OFF_plugins/imagekit/lib/optimizer/mozjpeg.php
2026-02-12 15:22:46 +01:00

100 lines
2.8 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace Kirby\Plugins\ImageKit\Optimizer;
/**
* Uses `mozjpeg` for encoding JPEG files. This often creates
* much smaller JPEG files than most other encoders at a
* comparable quality.
*
* See: https://github.com/mozilla/mozjpeg
*/
class MozJPEG extends Base {
public static $selector = ['image/jpeg'];
public $priority = [100, 5];
protected $targetFile;
protected $tmpFile;
public static function defaults() {
return [
'imagekit.mozjpeg.bin' => null,
'imagekit.mozjpeg.quality' => 85,
'imagekit.mozjpeg.flags' => '',
];
}
public static function available() {
return !empty(static::$kirby->option('imagekit.mozjpeg.bin'));
}
public function pre() {
$this->targetFile = $this->thumb->destination->root;
if($this->isDriver('im')) {
// Instruct imagemagick driver to write out a temporary,
// uncrompressed TGA file, so our JPEG will not be
// compressed twice. I played around with PNM too,
// because its much faster as an intermediate format,
// but some images got corrupted by mozjpeg.
$this->tmpFile = $this->getTemporaryFilename('tga');
$this->thumb->destination->root = $this->tmpFile;
} else {
// If GD driver (or an unknown driver) is active, we
// need to encode twice, because SimpleImage can only
// save to JPEG, PNG or GIF. As saving a 24-bit
// lossless PNG as an intermediate step is too
// expensive for large images, we need to encode
// as JPEG :-(
// This also needs a temporary file, because it seems
// that mozjpeg cannot overwrite the its file.
$this->tmpFile = $this->getTemporaryFilename();
$this->thumb->destination->root = $this->tmpFile;
$this->thumb->options['quality'] = 99;
}
}
public function post() {
$command = [];
$command[] = static::$kirby->option('imagekit.mozjpeg.bin');
// Quality
$command[] = '-quality ' . $this->option('imagekit.mozjpeg.quality');
// Interlace
if($this->thumb->options['interlace']) {
$command[] = '-progressive';
}
// Grayscale
if($this->thumb->options['grayscale']) {
$command[] = '-grayscale';
}
// Set output file.
$command[] = '-outfile "' . $this->targetFile . '"';
$flags = $this->option('imagekit.mozjpeg.flags');
if(!empty($flags)) {
// Add exra flags, if defined by user.
$command[] = $flags;
}
// Use tmp file as input.
$command[] = '"' . $this->tmpFile . '"';
exec(implode(' ', $command));
// Delete temporary file and restore destination path
// on thumb object. This only needs to be done, if
// ImageMagick driver is used and the input file was
// in PNM format.
@unlink($this->tmpFile);
$this->thumb->destination->root = $this->targetFile;
}
}