Php Imagemagick trimimage功能还可以在图像内部出现背景色时进行修剪(不仅仅是边框)

Php Imagemagick trimimage功能还可以在图像内部出现背景色时进行修剪(不仅仅是边框),php,imagemagick,image-manipulation,Php,Imagemagick,Image Manipulation,因此,我尝试根据背景颜色,使用imagemagick trimimage函数(PHP)修剪图像的边框。下面是我试图做的一个演示,以及问题所在 当我上传此图像时(此图像顶部和右侧有厚厚的白色边框): 并运行以下代码: $canvas->setBackgroundColor('#ffffff'); $quantumRange = $canvas->getQuantumRange(); $canvas->trimImage(0.3 * $quantumRange['quantumR

因此,我尝试根据背景颜色,使用imagemagick trimimage函数(PHP)修剪图像的边框。下面是我试图做的一个演示,以及问题所在

当我上传此图像时(此图像顶部和右侧有厚厚的白色边框):

并运行以下代码:

$canvas->setBackgroundColor('#ffffff');
$quantumRange = $canvas->getQuantumRange();
$canvas->trimImage(0.3 * $quantumRange['quantumRangeLong']);
$canvas->setImagePage(0, 0, 0, 0);
结果正是我所期望的:白色的边框被修剪掉了。

但使用下图(无外部边框):

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

现在,根据我的理解,trimimage应该采用背景色并从外到内进行修剪,并且只有当图像的外缘(边框)与此颜色匹配时

因此,要么我理解错误,要么我在实现中遗漏了一些东西。此外,使用模糊值也不是一个选项。在某一点上,它将停止修剪蓝色边框,但在这一点上,如果存在外部边框,它也不会进行足够的修剪,因为我需要一个足够高的值来同时删除灯光阴影或压缩瑕疵

因此,实际问题是: 1.当外部边框颜色与背景颜色匹配时,是否有方法仅从外部向内裁剪图像?也许我错过了什么。 2.你能推荐另外一种方法吗

编辑: 在@fmw42回答了下面的问题后,我仔细研究了边缘检测到底是什么以及它是如何工作的。我的假设是imagemagick查看图像的边界,并根据给定的背景颜色进行剪切,这是错误的。为了更好地理解,请检查边缘检测的工作原理:


谢谢。

Imagemagick-仅当侧边颜色在fuzz值内时,修剪才会从两侧进行修剪。你的白色背景没有任何作用。-trim函数查看边的颜色并向内修剪,直到边的行和列超过边上颜色的模糊值。它查看角颜色以确定是否修剪。在第一种情况下,有3个白色角。因此,它将修剪顶部和右侧的白色。在第二种情况下,您现在有3个蓝色角。因此,它将在顶部和右侧向内修剪,以去除一些蓝色

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

输入1:


请注意,30%相当于0.3*quantumrange

图2:


在不添加白色边框的情况下,-trim从3个角将蓝色边框视为边框。所以它会修剪成蓝色

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

如果将“fuzz”值增加到50%,它将更加明显并修剪到企鹅身上

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


谢谢你,这个技巧很有效(我自己真的应该这么做的!),最重要的是,我现在明白了边缘检测实际上并不代表边界检测(这是我的假设)。对于其他需要了解这一点的人,这里有一个链接。这让事情变得更清楚。
@mspir
编写了
编辑:在@fmw42回答了下面的问题后,我仔细研究了边缘检测到底是什么以及它是如何工作的。我的假设是imagemagick查看图像的边界,并根据给定的背景颜色进行剪切,这是错误的convert image2.jpg -fuzz 30% -trim +repage image2b_trim.jpg
convert image2.jpg -fuzz 30% -trim +repage image2c_trim.jpg