我希望使用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表示它应该适用于对象(在这种情况下是单个图像)......
答案 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的最佳实践