Imagemagick trimimage 函数也会在图像内存在背景颜色时进行修剪(不仅仅是边框)
Imagemagick trimimage function also trims when background color is present inside the image (not just borders)
所以我正在尝试 trim 使用 imagemagick trim 图像函数 (PHP) 的图像边框,基于背景颜色。下面是我正在尝试做的事情以及问题所在的演示。
当我上传这张图片时(这张图片的顶部和右侧有白色粗边框):
和运行下面的代码:
$canvas->setBackgroundColor('#ffffff');
$quantumRange = $canvas->getQuantumRange();
$canvas->trimImage(0.3 * $quantumRange['quantumRangeLong']);
$canvas->setImagePage(0, 0, 0, 0);
结果正是我所期望的:白色边框被trim消除了。
但是使用下图(无外边框):
和 运行 使用相同的代码,图像从内部得到 trimmed(?) 并产生一些奇怪的效果:
现在,根据我的理解,trim图像应该采用背景颜色,并且 trim 它从外到内,并且只有当图像的外边距(边框)与此匹配时颜色.
所以,要么我理解 trimimage 错误,要么我在实现中遗漏了一些东西。此外,玩弄 fuzz 值也不是一种选择。在某些时候它会停止 trim 蓝色边框,但在这一点上它也不会 trim 如果有外边框,因为我需要一个足够高的值来去除光影或压缩伪影。
所以实际的问题是:
1.当外边框颜色与背景颜色匹配时,有没有办法只从外向内裁剪图像?也许我错过了什么。
2. 还有其他方法可以推荐吗?
编辑:
@fmw42 在下面回答后,我仔细研究了边缘检测到底是什么以及它是如何工作的。我的假设是 imagemagick 查看图像的边界并根据给定的背景颜色剪切它们,这是错误的。为了更好地理解,请查看边缘检测的工作原理:https://en.wikipedia.org/wiki/Edge_detection
谢谢。
Imagemagick -trim 仅当侧面颜色在模糊值范围内时,才会从每个侧面 trim。你的白色背景什么都不做。 -trim 函数查看边缘的颜色并向内 trims 直到边缘的行和列超过边缘颜色的模糊值。它会查看角的颜色以确定是否 trim。在您的第一种情况下,您有 3 个白色角。所以它将 trim 顶部和右侧的白色。在你的第二种情况下,你现在有 3 个蓝色角。因此,它将 trim 在顶部和右侧向内去除一些蓝色。
我想你想要做的是在背景颜色的图像周围放置一个 1 像素的边框。在这种情况下,您需要白色。
输入 1:
convert image1.jpg -bordercolor white -border 1 -fuzz 30% -trim +repage image_trim.jpg
注意30%相当于0.3*quantumrange
图2:
convert image2.jpg -bordercolor white -border 1 -fuzz 30% -trim +repage image2a_trim.jpg
在不添加白色边框的情况下,-trim 将蓝色视为来自 3 个角的边框。所以它会 trim 蓝色。
convert image2.jpg -fuzz 30% -trim +repage image2b_trim.jpg
如果将模糊值增加到 50%,它会更明显 trim 到企鹅。
convert image2.jpg -fuzz 30% -trim +repage image2c_trim.jpg
所以我正在尝试 trim 使用 imagemagick trim 图像函数 (PHP) 的图像边框,基于背景颜色。下面是我正在尝试做的事情以及问题所在的演示。
当我上传这张图片时(这张图片的顶部和右侧有白色粗边框):
和运行下面的代码:
$canvas->setBackgroundColor('#ffffff');
$quantumRange = $canvas->getQuantumRange();
$canvas->trimImage(0.3 * $quantumRange['quantumRangeLong']);
$canvas->setImagePage(0, 0, 0, 0);
结果正是我所期望的:白色边框被trim消除了。
但是使用下图(无外边框):
和 运行 使用相同的代码,图像从内部得到 trimmed(?) 并产生一些奇怪的效果:
现在,根据我的理解,trim图像应该采用背景颜色,并且 trim 它从外到内,并且只有当图像的外边距(边框)与此匹配时颜色.
所以,要么我理解 trimimage 错误,要么我在实现中遗漏了一些东西。此外,玩弄 fuzz 值也不是一种选择。在某些时候它会停止 trim 蓝色边框,但在这一点上它也不会 trim 如果有外边框,因为我需要一个足够高的值来去除光影或压缩伪影。
所以实际的问题是: 1.当外边框颜色与背景颜色匹配时,有没有办法只从外向内裁剪图像?也许我错过了什么。 2. 还有其他方法可以推荐吗?
编辑: @fmw42 在下面回答后,我仔细研究了边缘检测到底是什么以及它是如何工作的。我的假设是 imagemagick 查看图像的边界并根据给定的背景颜色剪切它们,这是错误的。为了更好地理解,请查看边缘检测的工作原理:https://en.wikipedia.org/wiki/Edge_detection
谢谢。
Imagemagick -trim 仅当侧面颜色在模糊值范围内时,才会从每个侧面 trim。你的白色背景什么都不做。 -trim 函数查看边缘的颜色并向内 trims 直到边缘的行和列超过边缘颜色的模糊值。它会查看角的颜色以确定是否 trim。在您的第一种情况下,您有 3 个白色角。所以它将 trim 顶部和右侧的白色。在你的第二种情况下,你现在有 3 个蓝色角。因此,它将 trim 在顶部和右侧向内去除一些蓝色。
我想你想要做的是在背景颜色的图像周围放置一个 1 像素的边框。在这种情况下,您需要白色。
输入 1:
convert image1.jpg -bordercolor white -border 1 -fuzz 30% -trim +repage image_trim.jpg
注意30%相当于0.3*quantumrange
图2:
convert image2.jpg -bordercolor white -border 1 -fuzz 30% -trim +repage image2a_trim.jpg
在不添加白色边框的情况下,-trim 将蓝色视为来自 3 个角的边框。所以它会 trim 蓝色。
convert image2.jpg -fuzz 30% -trim +repage image2b_trim.jpg
如果将模糊值增加到 50%,它会更明显 trim 到企鹅。
convert image2.jpg -fuzz 30% -trim +repage image2c_trim.jpg