# HG changeset patch # User Matti Hamalainen # Date 1544971710 -7200 # Node ID 32c13f594e39418ec45300144fed6c3ef80fcd12 # Parent 50f8932ab1cbed3091a3e2c730fe7033afca8144 Add support for PHP GraphicsMagick bindings, though it kind of sucks due to poor documentation of the said bindings. diff -r 50f8932ab1cb -r 32c13f594e39 mgtool.php --- a/mgtool.php Wed Dec 12 17:27:50 2018 +0200 +++ b/mgtool.php Sun Dec 16 16:48:30 2018 +0200 @@ -48,93 +48,168 @@ // // Convert and scale image file function, for generating // the intermediate size images and thumbnails. Uses the -// PHP ImageMagick bindings. +// PHP ImageMagick or GraphicsMagick bindings. // function mgConvertImage($inFilename, $outFilename, $outDim, $outFormat, $outQuality, $thumb) { - // Create conversion entity - try + if (extension_loaded("imagick") && extension_loaded("imagick")) { - $img = new Imagick($inFilename); - } - catch (Exception $e) - { - return mgError("ImageMagick exception for file '".$inFilename."':\n".$e->getMessage()."\n"); + return mgError("WARNING! Both ImageMagick AND GraphicsMagick modules enabled in PHP! This will cause problems! Refusing to work.\n"); } - if ($img === FALSE) - return mgError("ImageMagick could not digest the file '".$inFilename."'.\n"); - - $profiles = $img->getImageProfiles("icc", true); - $img->setImageDepth(16); - $img->transformImageColorspace(Imagick::COLORSPACE_SRGB); - $img->setImageColorspace(Imagick::COLORSPACE_SRGB); - - if ($outDim !== FALSE) + if (extension_loaded("imagick")) { - // Get dimensions, setup background - $dim = $img->getImageGeometry(); - //$img->setImageBackgroundColor(imagick::COLOR_BLACK); - $img->setGravity(imagick::GRAVITY_CENTER); - - - if ($dim["width"] < $dim["height"]) + // Create conversion entity + try { - $stmp = $outDim[0]; - $outDim[0] = $outDim[1]; - $outDim[1] = $stmp; + $img = new Imagick($inFilename); + } + catch (Exception $e) + { + return mgError("ImageMagick exception for file '".$inFilename."':\n".$e->getMessage()."\n"); } - if ($dim["width"] != $outDim[0] || $dim["height"] != $outDim[1]) + if ($img === FALSE) + return mgError("ImageMagick could not digest '".$inFilename."'.\n"); + + $profiles = $img->getImageProfiles("icc", true); + $img->setImageDepth(16); + $img->transformImageColorspace(Imagick::COLORSPACE_SRGB); + $img->setImageColorspace(Imagick::COLORSPACE_SRGB); + + if ($outDim !== FALSE) { - $outDim[1] = ($dim["height"] * $outDim[0]) / $dim["width"]; + // Get dimensions, setup background + $dim = $img->getImageGeometry(); + $img->setGravity(imagick::GRAVITY_CENTER); + + if ($dim["width"] < $dim["height"]) + { + $stmp = $outDim[0]; + $outDim[0] = $outDim[1]; + $outDim[1] = $stmp; + } + + if ($dim["width"] != $outDim[0] || $dim["height"] != $outDim[1]) + { + $outDim[1] = ($dim["height"] * $outDim[0]) / $dim["width"]; + } + + // Act based on image size vs. desired size and $thumb mode + if ($thumb || $dim["width"] != $outDim[0] || $dim["height"] != $outDim[1]) + { + $img->resizeImage($outDim[0], $outDim[1], Imagick::FILTER_LANCZOS, 1); + $img->setImageExtent($outDim[0], $outDim[1]); + $img->unsharpMaskImage(0, 0.5, 1, 0.05); + } + } + + $img->setImageDepth(8); + $tfmt = strtolower($outFormat); + switch ($tfmt) + { + case "jpeg": + $img->setFormat("JPEG"); + $img->setImageCompression(Imagick::COMPRESSION_JPEG); + break; + + case "webp": + $img->setFormat("WEBP"); + $img->setOption('webp:method', '6'); + break; + + default: + return mgError("Unsupported MGallery med/tn format '".$tfmt."'.\n"); } - // Act based on image size vs. desired size and $thumb mode - if ($thumb || $dim["width"] > $outDim[0] || $dim["height"] > $outDim[1]) + $img->setImageCompressionQuality($outQuality); + + $img->stripImage(); + if (!empty($profiles)) + $img->profileImage("icc", $profiles["icc"]); + + $img->writeImage($outFilename); + $img->removeImage(); + } + else + if (extension_loaded("gmagick")) + { + // Create conversion entity + try { - // Image is larger - $img->resizeImage($outDim[0], $outDim[1], Imagick::FILTER_LANCZOS, 1); - $img->setImageExtent($outDim[0], $outDim[1]); -// $img->normalizeImage(); - $img->unsharpMaskImage(0, 0.5, 1, 0.05); + $img = new Gmagick($inFilename); + } + catch (Exception $e) + { + return mgError("GraphicsMagick exception for file '".$inFilename."':\n".$e->getMessage()."\n"); } - if ($dim["width"] < $outDim[0] || $dim["height"] < $outDim[1]) + + if ($img === FALSE) + return mgError("GraphicsMagick could not digest '".$inFilename."'.\n"); + +// $profiles = $img->getImageProfile("icc"); +// $img->setImageDepth(16); +// $img->setImageColorspace(Gmagick::COLORSPACE_SRGB); + + if ($outDim !== FALSE) { - // Image is smaller than requested dimension(s)? - $img->resizeImage($outDim[0], $outDim[1], Imagick::FILTER_LANCZOS, 1); - $img->setImageExtent($outDim[0], $outDim[1]); -// $img->normalizeImage(); - $img->unsharpMaskImage(0, 0.5, 1, 0.05); + // Get dimensions, setup background + $dim = $img->getImageGeometry(); + //$img->setGravity(Gmagick::GRAVITY_CENTER); + + if ($dim["width"] < $dim["height"]) + { + $stmp = $outDim[0]; + $outDim[0] = $outDim[1]; + $outDim[1] = $stmp; + } + + if ($dim["width"] != $outDim[0] || $dim["height"] != $outDim[1]) + { + $outDim[1] = ($dim["height"] * $outDim[0]) / $dim["width"]; + } + + // Act based on image size vs. desired size and $thumb mode + if ($thumb || $dim["width"] != $outDim[0] || $dim["height"] != $outDim[1]) + { + $img->resizeImage($outDim[0], $outDim[1], Gmagick::FILTER_LANCZOS, 1); + //$img->setImageExtent($outDim[0], $outDim[1]); + //$img->unsharpMaskImage(0, 0.5, 1, 0.05); + } } + + $img->setImageDepth(8); + $tfmt = strtolower($outFormat); + switch ($tfmt) + { + case "jpeg": + $img->setFormat("JPEG"); + $img->setImageCompression(Gmagick::COMPRESSION_JPEG); + break; + + case "webp": + $img->setFormat("WEBP"); +// $img->setOption('webp:method', '6'); + break; + + default: + return mgError("Unsupported MGallery med/tn format '".$tfmt."'.\n"); + } + + $img->setCompressionQuality($outQuality); + + $img->stripImage(); +// if (!empty($profiles)) +// $img->profileImage("icc", $profiles); + + $img->writeImage($outFilename); + $img->removeImage(); + } + else + { + return mgError("No ImageMagick OR GraphicsMagick module in PHP!\n"); } - $img->setImageDepth(8); - $tfmt = strtolower($outFormat); - switch ($tfmt) - { - case "jpeg": - $img->setFormat("JPEG"); - $img->setImageCompression(Imagick::COMPRESSION_JPEG); - break; - - case "webp": - $img->setFormat("WEBP"); - $img->setOption('webp:method', '6'); - break; - - default: - return mgError("Unsupported MGallery med/tn format '".$tfmt."'.\n"); - } - - $img->setImageCompressionQuality($outQuality); - - $img->stripImage(); - if (!empty($profiles)) - $img->profileImage("icc", $profiles["icc"]); - - $img->writeImage($outFilename); - $img->removeImage(); return TRUE; }