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

问题描述 投票:1回答:1

因此,我尝试使用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

现在,形成我所理解的,修剪图像应采用背景颜色并从外部修剪它,并且只有当图像的外边缘(边框)与此颜色匹配时。

所以,要么我理解修剪错误,要么我在实施中遗漏了一些东西。此外,玩弄模糊值不是一种选择。在某些时候它会停止修剪蓝色边框,但此时如果有外边框它也不会修剪得足够,因为我需要一个足够高的值来消除光影或压缩瑕疵。

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

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

谢谢。

php imagemagick image-manipulation
1个回答
2
投票

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

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

输入1:

enter image description here

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

注意,30%相当于0.3 *量子范围

enter image description here

镜像2:

enter image description here

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

enter image description here

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

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

enter image description here

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

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

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.