X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FImageMagick%2FImageMagickPlugin.php;h=927445211cee75057d69d222c84ebb845e87bcbd;hb=d4482757134f33b36de3003421853246ec04ed91;hp=26335b6df884c1885dc16228ad9de7f6af11dd98;hpb=2a7d45c98649bc9b2479e0ef2cf04fa404fa5358;p=quix0rs-gnu-social.git diff --git a/plugins/ImageMagick/ImageMagickPlugin.php b/plugins/ImageMagick/ImageMagickPlugin.php index 26335b6df8..927445211c 100644 --- a/plugins/ImageMagick/ImageMagickPlugin.php +++ b/plugins/ImageMagick/ImageMagickPlugin.php @@ -34,38 +34,27 @@ 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) { - if (is_null($imagefile->animated) && $imagefile->type === IMAGETYPE_GIF) { + if (is_null($imagefile->animated) && $imagefile->mimetype === 'image/gif') { $magick = new Imagick($imagefile->filepath); $magick = $magick->coalesceImages(); $imagefile->animated = $magick->getNumberImages()>1; @@ -74,36 +63,76 @@ class ImageMagickPlugin extends Plugin 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, @@ -111,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; } } -