【问题标题】:center crop with gravity using Imagick and PHP使用 Imagick 和 PHP 以重力居中裁剪
【发布时间】:2011-11-04 16:21:33
【问题描述】:

我希望使用 Imagick PHP api(不是命令行版本的 Imagick)来居中裁剪和图像。

基本上我想通过命令行使用 API 来做可能的事情。这是通过命令行的示例: http://www.imagemagick.org/Usage/crop/#crop_gravity

这就是我正在做的事情(不工作)。它总是裁剪源的左上角:

        $this->imagickObj->setGravity(\Imagick::GRAVITY_CENTER);
        $this->imagickObj->cropImage(300,250,0,0);
        $this->imagickObj->setImagePage(0, 0, 0, 0);

为什么 setGravity 在裁剪前没有应用于图像? http://www.php.net/manual/en/function.imagick-setgravity.php 说它应该应用于对象(在这种情况下是单个图像)...

【问题讨论】:

    标签: php imagick


    【解决方案1】:

    对于最初提出问题的人来说为时已晚,但对于未来的访问者来说,正确的解决方案是

    bool Imagick::cropThumbnailImage ( int $width , int $height )

    抱歉回复晚了,但我在 30 分钟前也被困在这里,第一个谷歌结果将我重定向到这里。希望其他人不会发生同样的情况。

    【讨论】:

    • 这总是居中裁剪吗?如果我想改变重力怎么办?
    • 是的,它总是以重心裁剪。实际上它首先缩放图像以匹配高度或宽度,然后从中心裁剪以制作任何图像的缩略图。这与 FB、twitter、google 和许多其他网站用于创建缩略图的逻辑相同。如果你需要改变重力,使用bool Imagick::cropImage ( int $width , int $height , int $x , int $y )定义在php.net/manual/en/imagick.cropimage.php
    【解决方案2】:

    看起来没有支持,这是我最终的做法: https://gist.github.com/1364489

    【讨论】:

    • 你如何定义这些计算?
    【解决方案3】:

    Imagemagick 对象的cropImage() 方法的第三和第四个参数定义裁剪的左上角。要么尝试将它们作为null 传递(并使用setGravity() 方法),要么您实际上可能必须计算应该在哪里进行作物并将这些数字弹出到cropImage() 方法中(不要打扰setGravity())。

    为了它的价值,我已经使用 PHP 围绕 Imagemagick 进行了大量编码,并且由于 Imagemagick 扩展的可怕文档,我求助于进行大量漂亮的命令行调用。

    【讨论】:

    • 谢谢。 null,null 不起作用。我可以做数学,但如果可能的话,我更愿意利用内置的。我想避免使用 CLI 有很多原因,其中一个是性能(我正在编写一个将被大量使用的图像处理服务)。
    • 我编写的使用 CLI 的主要服务每天处理几千张图像而不会出现任何问题,它在 Linux 上运行在具有 4GB RAM 的 Intel Core i5 760 上,还为几个网站提供服务.
    • 谢谢。我决定只做数学,因为它只花了几分钟。将把这个问题留几天,看看是否有人知道使用内置重力的方法。
    【解决方案4】:

    我创建了用于裁剪和调整图像大小的组件 这是代码(yii2)

    组件使用imagine/imagine扩展之前安装

    <?php
    namespace common\components;
    
    use Imagine\Gd\Imagine;
    use Imagine\Image\Box;
    use Imagine\Image\ImageInterface;
    use Imagine\Image\Point;
    use Imagine\Imagick\Image;
    
    class ResizeComponent
    {
        /**
         * Resize image
         * @param  string   $source         source image path
         * @param  string   $destination    destination image path
         * @param  int      $width
         * @param  int      $height
         * @param  int      $quality        Jpeg sampling quality (0-100, 80 is best for seo)
         * @return boolean                  is picture cropped
         */
        public static function resizeImage($source, $destination, $width, $height, $quality = 80)
        {
            if (file_exists($source) && is_file($source)) {
                $imagine   = new Imagine();
                $size      = new Box($width, $height);
                $mode      = ImageInterface::THUMBNAIL_INSET;
                $resizeimg = $imagine->open($source)->thumbnail($size, $mode);
                $sizeR     = $resizeimg->getSize();
                $widthR    = $sizeR->getWidth();
                $heightR   = $sizeR->getHeight();
                $preserve  = $imagine->create($size);
                $startX    = $startY    = 0;
                if ($widthR < $width) {
                    $startX = ($width - $widthR) / 2;
                }
                if ($heightR < $height) {
                    $startY = ($height - $heightR) / 2;
                }
                $preserve->paste($resizeimg, new Point($startX, $startY))
                    ->save($destination, array('jpeg_quality' => $quality));
                return true;
            } else {
                return false;
            }
        }
    
        /**
         * Crop image
         * @param  string   $source         source image path
         * @param  string   $destination    destination image path
         * @param  int      $width
         * @param  int      $height
         * @param  int      $quality        Jpeg sampling quality (0-100, 80 is best for seo)
         * @return boolean                  is picture cropped
         */
        public static function cropImage($source, $destination, $width, $height, $quality = 80)
        {
            if (file_exists($source) && is_file($source)) {
                $imagine = new Imagine();
                $size    = new Box($width, $height);
                $mode    = ImageInterface::THUMBNAIL_OUTBOUND;
                $image   = $imagine->open($source)->thumbnail($size, $mode);
                $image->thumbnail($size, $mode)->save($destination, array('jpeg_quality' => $quality));
                return true;
            } else {
                return false;
            }
        }
    }
    

    裁剪和调整大小的区别是:

    • crop 无法显示所有图像,因此将裁剪边框(最适合不提供信息的缩略图)
    • 调整大小显示完整图像,但边框将填充静态颜色(或透明,如果需要)(最好显示所有图像,如商店目录中所示)

    静态使用这个组件,作为ServiceLocator的最佳实践

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 2013-08-21
      • 2018-04-13
      • 2018-03-28
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      相关资源
      最近更新 更多