在更改图像裁剪的操作(如 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);
}