]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - plugins/ImageMagick/ImageMagickPlugin.php
Plugins didn't match lib/plugin.php onPluginVersion function definition
[quix0rs-gnu-social.git] / plugins / ImageMagick / ImageMagickPlugin.php
index f52ca24fecf9dc7a80fa0e3a90bd0d5b97b8f861..927445211cee75057d69d222c84ebb845e87bcbd 100644 (file)
@@ -34,78 +34,105 @@ if (!defined('GNUSOCIAL')) { exit(1); }
  *  php5-imagick
  *
  * Provides:
- *  Animated image support (for image/gif at least)
+ *  Animated GIF resize support
  *
- * Suggestions:
- *  After enabling the ImageMagick plugin, you might want to regenerate
- *  thumbnails for the newly support formats. This is easiest done with
- *  a script in the GNU social-bundled scripts directory:
- *  $ php scripts/clean_thumbnails.php
+ * Comments:
+ *  Animated GIF resize requires setting $config['thumbnail']['animated'] = true;
  *
  * Bugs:
  *  Not even ImageMagick is very good at resizing animated GIFs.
+ *  We are not infinitely fast, so resizing animated GIFs is _not_ recommended.
  */
 
 class ImageMagickPlugin extends Plugin
 {
-    // configurable plugin options must be declared public
-    public $resize_animated = null;
-
-    public function initialize()
-    {
-        parent::initialize();
-
-        if (is_null($this->resize_animated)) {
-            $this->resize_animated = common_config('image', 'resize_animated');
-        }
-    }
+    public $preview_imageformat = 'PNG';    // Image format strings: http://www.imagemagick.org/script/formats.php#supported
+    public $rasterize_vectors = false;       // Whether we want to turn SVG into PNG etc.
 
     /**
      * @param ImageFile $file An ImageFile object we're getting metadata for
      * @param array $info The response from getimagesize()
      */
     public function onFillImageFileMetadata(ImageFile $imagefile) {
-        switch ($imagefile->type) {
-        case IMAGETYPE_GIF:
+        if (is_null($imagefile->animated) && $imagefile->mimetype === 'image/gif') {
             $magick = new Imagick($imagefile->filepath);
             $magick = $magick->coalesceImages();
             $imagefile->animated = $magick->getNumberImages()>1;
-            return false;
         }
 
         return true;
     }
 
-    public function onStartResizeImageFile(ImageFile $imagefile, $outpath, array $box) {
-        // So far we only take over the resize for IMAGETYPE_GIF
-        // (and only animated for gifs!)
-        if ($imagefile->type == IMAGETYPE_GIF && $imagefile->animated) {
-            if (!$this->resize_animated) {
-                // Don't resize if not desired, due to CPU/time limitations
-                return false;
+    public function onStartResizeImageFile(ImageFile $imagefile, $outpath, array $box)
+    {
+        switch ($imagefile->mimetype) {
+        case 'image/gif':
+            // If GIF, then only for animated gifs! (and only if we really want to resize the animation!)
+            if ($imagefile->animated && common_config('thumbnail', 'animated')) {
+                return $this->resizeImageFileAnimatedGif($imagefile, $outpath, $box);
             }
-            $magick = new Imagick($imagefile->filepath);
-            $magick = $magick->coalesceImages();
-            $magick->setIteratorIndex(0);
-            do {
-                $magick->cropImage($box['w'], $box['h'], $box['x'], $box['y']);
-                $magick->thumbnailImage($box['width'], $box['height']);
-                $magick->setImagePage($box['width'], $box['height'], 0, 0);
-            } while ($magick->nextImage());
-            $magick = $magick->deconstructImages();
+            break;
+        }
+        return true;
+    }
+
+    protected function resizeImageFileAnimatedGif(ImageFile $imagefile, $outpath, array $box)
+    {
+        $magick = new Imagick($imagefile->filepath);
+        $magick = $magick->coalesceImages();
+        $magick->setIteratorIndex(0);
+        do {
+            $magick->cropImage($box['w'], $box['h'], $box['x'], $box['y']);
+            $magick->thumbnailImage($box['width'], $box['height']);
+            $magick->setImagePage($box['width'], $box['height'], 0, 0);
+        } while ($magick->nextImage());
+        $magick = $magick->deconstructImages();
 
-            // $magick->writeImages($outpath, true); did not work, had to use filehandle
-            // There's been bugs for writeImages in php5-imagick before, probably now too
-            $fh = fopen($outpath, 'w+');
-            $success = $magick->writeImagesFile($fh);
-            fclose($fh);
+        // $magick->writeImages($outpath, true); did not work, had to use filehandle
+        // There's been bugs for writeImages in php5-imagick before, probably now too
+        $fh = fopen($outpath, 'w+');
+        $success = $magick->writeImagesFile($fh);
+        fclose($fh);
+        $magick->destroy();
 
-            return !$success;
+        return !$success;
+    }
+
+    public function onCreateFileImageThumbnailSource(File $file, &$imgPath, $media=null)
+    {
+        switch ($file->mimetype) {
+        case 'image/svg+xml':
+            if (!$this->rasterize_vectors) {
+                // ImageMagick seems to be hard to trick into scaling vector graphics...
+                return true;
+            }
+            break;
+        default:
+            // If we don't know the format, let's try not to mess with anything.
+            return true;
         }
-        return true;
+
+        $imgPath = tempnam(sys_get_temp_dir(), 'socialthumb-');
+        if (!$this->createImagePreview($file, $imgPath)) {
+            common_debug('Could not create ImageMagick preview of File id=='.$file->id);
+            @unlink($imgPath);
+            $imgPath = null;
+            return true;
+        }
+        return false;
+    }
+
+    protected function createImagePreview(File $file, $outpath)
+    {
+        $magick = new Imagick($file->getPath());
+        $magick->setImageFormat($this->preview_imageformat);
+        $magick->writeImage($outpath);
+        $magick->destroy();
+
+        return getimagesize($outpath);  // Verify that we wrote an understandable image.
     }
 
-    public function onPluginVersion(&$versions)
+    public function onPluginVersion(array &$versions)
     {
         $versions[] = array('name' => 'ImageMagick',
                             'version' => GNUSOCIAL_VERSION,
@@ -113,8 +140,7 @@ class ImageMagickPlugin extends Plugin
                             'homepage' => 'http://gnu.io/social',
                             'rawdescription' =>
                             // TRANS: Plugin description.
-                            _m('Use ImageMagick for better image support.'));
+                            _m('Use ImageMagick for some more image support.'));
         return true;
     }
 }
-