File "Gmagick.php"
Full Path: /var/www/html/wordpress/wp-content/plugins/wp-optimize/vendor/rosell-dk/webp-convert/src/Convert/Converters/Gmagick.php
File size: 6.34 KB
MIME-type: text/x-php
Charset: utf-8
<?php
namespace WebPConvert\Convert\Converters;
use WebPConvert\Convert\Converters\AbstractConverter;
use WebPConvert\Convert\Exceptions\ConversionFailedException;
use WebPConvert\Convert\Exceptions\ConversionFailed\ConverterNotOperational\SystemRequirementsNotMetException;
use WebPConvert\Convert\Converters\ConverterTraits\EncodingAutoTrait;
//use WebPConvert\Convert\Exceptions\ConversionFailed\InvalidInput\TargetNotFoundException;
/**
* Convert images to webp using Gmagick extension.
*
* @package WebPConvert
* @author Bjørn Rosell <[email protected]>
* @since Class available since Release 2.0.0
*/
class Gmagick extends AbstractConverter
{
use EncodingAutoTrait;
protected function getUnsupportedDefaultOptions()
{
return [
'near-lossless',
'size-in-percentage',
];
}
/**
* Check (general) operationality of Gmagick converter.
*
* Note:
* It may be that Gd has been compiled without jpeg support or png support.
* We do not check for this here, as the converter could still be used for the other.
*
* @throws SystemRequirementsNotMetException if system requirements are not met
*/
public function checkOperationality()
{
if (!extension_loaded('Gmagick')) {
throw new SystemRequirementsNotMetException('Required Gmagick extension is not available.');
}
if (!class_exists('Gmagick')) {
throw new SystemRequirementsNotMetException(
'Gmagick is installed, but not correctly. The class Gmagick is not available'
);
}
$im = new \Gmagick($this->source);
if (!in_array('WEBP', $im->queryformats())) {
throw new SystemRequirementsNotMetException('Gmagick was compiled without WebP support.');
}
}
/**
* Check if specific file is convertable with current converter / converter settings.
*
* @throws SystemRequirementsNotMetException if Gmagick does not support image type
*/
public function checkConvertability()
{
$im = new \Gmagick();
$mimeType = $this->getMimeTypeOfSource();
switch ($mimeType) {
case 'image/png':
if (!in_array('PNG', $im->queryFormats())) {
throw new SystemRequirementsNotMetException(
'Gmagick has been compiled without PNG support and can therefore not convert this PNG image.'
);
}
break;
case 'image/jpeg':
if (!in_array('JPEG', $im->queryFormats())) {
throw new SystemRequirementsNotMetException(
'Gmagick has been compiled without Jpeg support and can therefore not convert this Jpeg image.'
);
}
break;
}
}
// Although this method is public, do not call directly.
// You should rather call the static convert() function, defined in AbstractConverter, which
// takes care of preparing stuff before calling doConvert, and validating after.
protected function doActualConvert()
{
// PS: graphicsmagick options are documented here: (search for "webp:")
// http://www.graphicsmagick.org/GraphicsMagick.html
$options = $this->options;
try {
$im = new \Gmagick($this->source);
} catch (\Exception $e) {
throw new ConversionFailedException(
'Failed creating Gmagick object of file',
'Failed creating Gmagick object of file: "' . $this->source . '" - Gmagick threw an exception.',
$e
);
}
$im->setimageformat('WEBP');
// setimageoption() has not always been there, so check first. #169
if (method_exists($im, 'setimageoption')) {
// Finally cracked setting webp options.
// See #167
// - and https://stackoverflow.com/questions/47294962/how-to-write-lossless-webp-files-with-perlmagick
if (!is_null($options['preset'])) {
if ($options['preset'] != 'none') {
$imageHint = $options['preset'];
switch ($imageHint) {
case 'drawing':
case 'icon':
case 'text':
$imageHint = 'graph';
$this->logLn(
'The "preset" value was mapped to "graph" because gmagick does not support "drawing",' .
' "icon" and "text", but grouped these into one option: "graph".'
);
}
$im->setimageoption('webp', 'image-hint', $imageHint);
}
}
$im->setimageoption('webp', 'method', $options['method']);
$im->setimageoption('webp', 'lossless', $options['encoding'] == 'lossless' ? 'true' : 'false');
$im->setimageoption('webp', 'alpha-quality', $options['alpha-quality']);
if ($options['auto-filter'] === true) {
$im->setimageoption('webp', 'auto-filter', 'true');
}
if ($options['sharp-yuv'] === true) {
$im->setimageoption('webp', 'use-sharp-yuv', 'true');
}
}
/*
low-memory seems not to be supported:
$im->setimageoption('webp', 'low-memory', $options['low-memory'] ? true : false);
*/
if ($options['metadata'] == 'none') {
// Strip metadata and profiles
$im->stripImage();
}
// Ps: Imagick automatically uses same quality as source, when no quality is set
// This feature is however not present in Gmagick
// TODO: However, it might be possible after all - see #91
$im->setcompressionquality($this->getCalculatedQuality());
// We call getImageBlob().
// That method is undocumented, but it is there!
// - just like it is in imagick, as pointed out here:
// https://www.php.net/manual/ru/gmagick.readimageblob.php
/** @scrutinizer ignore-call */
$imageBlob = $im->getImageBlob();
$success = @file_put_contents($this->destination, $imageBlob);
if (!$success) {
throw new ConversionFailedException('Failed writing file');
}
}
}