当图像内部存在背景颜色(不仅是边框)时,Imagemagick trimimage功能也会进行修剪

时间:2018-09-13 16:27:44

标签: php imagemagick image-manipulation

因此,我试图根据背景颜色使用imagemagick trimimage函数(PHP)修剪图像的边框。以下是我正在尝试做的事情以及问题所在的说明。

当我上传此图像时(该图像的顶部和右侧都有粗的白色边框): enter image description here

并运行以下代码:

$canvas->setBackgroundColor('#ffffff');
$quantumRange = $canvas->getQuantumRange();
$canvas->trimImage(0.3 * $quantumRange['quantumRangeLong']);
$canvas->setImagePage(0, 0, 0, 0);

结果恰好是我所期望的:白色边框被修剪掉了。 enter image description here

但是使用下面的图像(无外部边界): enter image description here

并运行相同的代码,从内部(?)修剪图像,并产生一些奇怪的效果: enter image description here

现在,按照我的理解,trimimage应该采用背景颜色,并从外部对其进行修剪,并且前提是图像的外部边缘(边界)与该颜色匹配。

因此,或者我理解trimimage错误,或者在实现中缺少某些内容。此外,也不可以选择使用模糊值。在某个时候它将停止修剪蓝色边框,但是在此时,如果存在外部边框,它将也无法修剪足够,因为我需要具有足够高的值以去除光影或压缩伪像。

所以实际的问题是: 1.当外部边框颜色与背景颜色匹配时,是否可以仅从外部裁剪图像?也许我错过了一些东西。 2.您还可以推荐另一种方法吗?

编辑: 在@ fmw42回答如下之后,我仔细研究了什么是边缘检测以及它是如何工作的。我的假设是imagemagick会查看图像的边界,并根据给定的背景色将其剪切掉,这是错误的。为了更好地理解,请检查边缘检测的工作原理:https://en.wikipedia.org/wiki/Edge_detection

谢谢。

1 个答案:

答案 0 :(得分:2)

Imagemagick -trim仅在侧面颜色在模糊值内时才从两侧修剪。您的白色背景什么都不做。 -trim函数查看边缘的颜色并向内修剪,直到边缘的行和列超过边缘颜色的模糊值为止。它查看角落的颜色以确定是否修剪。在第一种情况下,您有3个白角。因此它将修剪顶部和右侧的白色。在第二种情况下,您现在有3个蓝色角。因此,它将在顶部和右侧向内修剪以去除一些蓝色。

我认为您想要做的是在背景颜色的图像周围放置一个1像素的边框。在这种情况下,您需要白色。

输入1:

enter image description here

string


注意30%等于0.3 *量子范围

enter image description here

图片2:

enter image description here

convert image1.jpg -bordercolor white -border 1 -fuzz 30% -trim +repage image_trim.jpg


enter image description here

-trim在不添加白色边框的情况下将蓝色作为三个角的边界。因此它将修剪为蓝色。

convert image2.jpg -bordercolor white -border 1 -fuzz 30% -trim +repage image2a_trim.jpg


enter image description here

如果将模糊值增加到50%,它将更加明显并修剪到企鹅。

convert image2.jpg -fuzz 30% -trim +repage image2b_trim.jpg


enter image description here