在进行更改图像裁剪的操作(如 trimImage 所做)后,IM 会保留旧的画布和定位信息。如果您需要根据新尺寸对图像进行更多操作,则需要使用 setImagePage 重置此信息。这等同于 +repage 命令行参数。
<?php
$im->trimImage(0);
$im->setImagePage(0, 0, 0, 0);
?>
(PECL imagick 2, PECL imagick 3)
Imagick::trimImage — 从图像中移除边缘
从图像中移除背景色的边缘。如果 Imagick 编译时使用了 ImageMagick 6.2.9 或更高版本,则可以使用此方法。
fuzz
默认情况下,目标必须与特定像素颜色完全匹配。但是,在许多情况下,两种颜色可能略有不同。图像的 fuzz 成员定义了将两种颜色视为相同的容差。此参数表示量子范围的变化。
成功时返回 true
。
错误时抛出 ImagickException。
示例 #1 使用 Imagick::trimImage()
修剪图像,然后显示到浏览器。
<?php
/* 创建对象并读取图像 */
$im = new Imagick("image.jpg");
/* 修剪图像。 */
$im->trimImage(0);
/* 输出图像 */
header("Content-Type: image/" . $im->getImageFormat());
echo $im;
?>
在进行更改图像裁剪的操作(如 trimImage 所做)后,IM 会保留旧的画布和定位信息。如果您需要根据新尺寸对图像进行更多操作,则需要使用 setImagePage 重置此信息。这等同于 +repage 命令行参数。
<?php
$im->trimImage(0);
$im->setImagePage(0, 0, 0, 0);
?>
trim 命令可以返回信息,告诉您图像被裁剪的位置坐标以及裁剪后图像的新尺寸。我找不到使用此类的示例,所以以下是我使用的方法
<?php
// 创建并修剪图像
$image = new Imagick('image.png');
$image->trimImage(0.3);
/**
* Imagick:: getImagePage() 给我们一个数组,其中包含裁剪后图像的宽度、高度、x 和 y 坐标
* 但是,宽度和高度是原始图像的
*/
$imagePage = $image->getImagePage();
list($x, $y) = array($imagePage['x'], $imagePage['y']);
// 因此我们需要重置图像页面以获取裁剪后图像的正确高度和宽度
$image->setImagePage(0, 0, 0, 0);
list($width, $height) = array($image->width, $image->height);
?>
这将为您留下裁剪后图像的宽度和高度的两个变量,以及相对于原始图像的裁剪区域的 x 坐标和 y 坐标的两个变量。
当您要裁剪的图像是两个图像之间的差异时,此信息很有用(例如,来自 Imagick::compareImages(),并且您希望将原始图像裁剪到与差异相同的尺寸和位置)。
fuzz 需要 getQuantum
/**
* @param string $imagePath
* @param float $fuzz 0.1=10%
* @return bool
* @throws ImagickException
*/
public static function trimImage($imagePath, $fuzz = 0.1)
{
if (empty($imagePath)) {
return false;
}
$imagePath = realpath($imagePath);
if (!is_file($imagePath)) {
return false;
}
if (!class_exists('Imagick')) {
return false;
}
$im = new Imagick($imagePath);
$result = $im->trimImage($fuzz * $im::getQuantum());
if (!$result) {
return false;
}
return $im->writeImage($imagePath);
}