使用Imagick和PHP重心进行中心裁剪

时间:2011-11-04 16:21:33

标签: php imagick

我希望使用Imagick PHP apis(不是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表示它应该适用于对象(在这种情况下是单个图像)......

4 个答案:

答案 0 :(得分:13)

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

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

很抱歉迟到的回复,但我在30分钟前就已经卡在这里了,第一次google结果将我重定向到了这里。希望与其他人不会发生同样的事情。

答案 1 :(得分:3)

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

答案 2 :(得分:0)

Imagemagick对象的cropImage()方法的第3和第4个参数定义了裁剪的左上角。要么尝试将它们作为null传递(并使用setGravity()方法),要么实际上您可能必须计算裁剪应该发生的位置并将这些数字弹出到cropImage()方法中(并且不要打扰setGravity())。

为了它的价值,我使用PHP在Imagemagick上做了很多编码,由于Imagemagick扩展的可怕文档,我使用了很多很好的命令行调用。

答案 3 :(得分:0)

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

组件使用想象/想象扩展,请之前

安装
<?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;
        }
    }
}

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

  • 农作物无法显示所有图像,因此边框将被裁剪(最好用于无信息的缩略图)
  • 调整大小可显示完整图像,但边框将填充为静态颜色(或根据需要设置透明性)(最好显示所有图像,如商店目录中所示)

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