这是您可以使用的一种方法,类似于 Photoshop 魔棒工具:
convert original.jpg -alpha set -channel alpha -fuzz 18% \
-fill none -floodfill +0+0 black transparent-border.png
以下是细分的命令:
convert original.jpg
:用原始图像启动Imagemagick
-alpha set
:激活 Alpha 通道
-channel alpha
:让后续操作符作用于 alpha 通道
-fuzz 18%
: see -floodfill
...
-fill none
: see -floodfill
...
-floodfill +0+0 black
:从左上角开始(+0+0
)并找到其中的相邻像素-fuzz
的颜色距离black
并替换它-fill
transparent-border.png
:输出图像
Here's the result:
不幸的是,正如您所看到的,这种方法仍然会在您提供的图像中留下一些暗像素,因为边框不是纯黑色,并且与内部灰色边框有点混合,而且图像本身非常小。
如果您有质量更好的源图像,或者可以在修改后缩小尺寸的较大源图像,您将获得更好的结果。
如果您被这些小图像困住了(或者如果您只是想使用另一种方法),我建议您采用不同的路线,创建自己的遮罩形状,该形状仅小于原始照片的形状,然后添加回来你自己的灰色边框。我在下面整理了这个过程的一个例子。
此方法的可能命令是:
convert original.jpg mask.png -compose CopyOpacity -composite \
-compose src-over new-border.png -composite clean-result.png
...崩溃了...
convert original.jpg mask.png
:使用原始图像启动Imagemagick并引入mask.png作为第二层(mask.png是黑色背景上照片的白色圆角矩形形状,但形状比原始图像稍小 - 结果将删除原件的灰色和黑色边框)。
-compose CopyOpacity -composite
:使用mask.png从original.png中“剔除”形状
-compose src-over
:将复合方法重置为简单的覆盖
new-border.png -composite
:覆盖灰色边框(png是3px宽边框,透明背景上蒙版边缘每侧1px)
clean-result.png
:输出图像
我在 Photoshop 中创建了 mask.png 和 new-border.png。你could使用 Imagemagick 的矢量工具并仅使用original.jpg 在一个命令中完成这一切,但这并不容易。
The result of the above:
最后一点,我不确定您是使用 PHP 的 Imagick 还是命令行中的 Imagemagick。几年前,我尝试使用 Imagick,但很快就因为与命令行相比缺乏文档而感到沮丧(不过,也许情况已经改变了)。相反,我从 PHP 执行命令(例如,从exec()
or passthru()
)。一些或许多其他人可能会告诉您,您永远不应该从 PHP 执行 shell 命令,但只要您小心地转义任何参数,我还没有看到令人信服的反对这样做的论据。然后您将可以使用整个 Imagemagick 文档(http://www.imagemagick.org/Usage/ http://www.imagemagick.org/Usage/).
Cheers.