changeset 261:32c13f594e39

Add support for PHP GraphicsMagick bindings, though it kind of sucks due to poor documentation of the said bindings.
author Matti Hamalainen <ccr@tnsp.org>
date Sun, 16 Dec 2018 16:48:30 +0200
parents 50f8932ab1cb
children 3c9ce1ad3c45
files mgtool.php
diffstat 1 files changed, 143 insertions(+), 68 deletions(-) [+]
line wrap: on
line diff
--- 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;
 }