msp*_*pir 2 php image-manipulation imagemagick
所以我尝试根据背景颜色使用 imagemagick trimimage 函数(PHP)修剪图像的边框。下面是我正在尝试做的事情以及问题所在的演示。
并运行以下代码:
$canvas->setBackgroundColor('#ffffff');
$quantumRange = $canvas->getQuantumRange();
$canvas->trimImage(0.3 * $quantumRange['quantumRangeLong']);
$canvas->setImagePage(0, 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)
并运行相同的代码,图像从内部被修剪(?)并产生一些奇怪的效果:

现在,根据我的理解,trimimage 应该采用背景颜色并从外向内修剪它,并且仅当图像的外边距(边框)与该颜色匹配时。
所以,要么我对修剪图像的理解错误,要么我在实现中遗漏了一些东西。此外,玩弄模糊值也不是一种选择。在某些时候,它会停止修剪蓝色边框,但此时如果存在外部边框,它也不会修剪得足够多,因为我需要一个足够高的值来消除光阴影或压缩伪影。
所以实际的问题是: 1. 当外边框颜色与背景颜色匹配时,有没有办法仅从外向内裁剪图像?也许我错过了什么。2. 还有其他方法可以推荐吗?
编辑:@fmw42 在下面回答后,我仔细研究了边缘检测到底是什么以及它是如何工作的。我的假设是 imagemagick 查看图像的边界并根据给定的背景颜色剪切它们,这是错误的。为了更好地理解,请检查边缘检测的工作原理: https: //en.wikipedia.org/wiki/Edge_detection
谢谢。
仅当侧面颜色在模糊值范围内时,Imagemagick -trim 才会从每一面修剪。你的白色背景没有任何作用。-trim 函数查看边缘的颜色并向内修剪,直到边缘的行和列超过边缘颜色的模糊值。它查看角的颜色来确定是否修剪。在第一种情况下,您有 3 个白色角。所以它将修剪顶部和右侧的白色。在第二种情况下,您现在有 3 个蓝色角。因此,它将在顶部和右侧向内修剪以去除一些蓝色。
我认为你想要做的是在背景颜色的图像周围放置一个 1 像素边框。在这种情况下你想要白色。
输入1:
convert image1.jpg -bordercolor white -border 1 -fuzz 30% -trim +repage image_trim.jpg
Run Code Online (Sandbox Code Playgroud)
请注意,30% 相当于 0.3*quantumrange
图片2:
convert image2.jpg -bordercolor white -border 1 -fuzz 30% -trim +repage image2a_trim.jpg
Run Code Online (Sandbox Code Playgroud)
在不添加白色边框的情况下,-trim 将蓝色视为 3 个角的边框。所以它会修剪成蓝色。
convert image2.jpg -fuzz 30% -trim +repage image2b_trim.jpg
Run Code Online (Sandbox Code Playgroud)
如果将模糊值增加到50%,对企鹅来说会更加明显和修剪。
convert image2.jpg -fuzz 30% -trim +repage image2c_trim.jpg
Run Code Online (Sandbox Code Playgroud)