我已经多次阅读了文档并尝试了几个解决方案,但没有弄清楚如何实现。
任何帮助都会受到赞赏。
谢谢
这里有一个与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%
: 查看 -floodfill
...
-fill none
: 查看 -floodfill
...
-floodfill +0+0 black
: 从左上角 (+0+0
) 开始,查找与 black
距离在 -fuzz
范围内的相邻像素,并替换为 -fill
transparent-border.png
: 输出图像
这是结果:
不幸的是,如你所见,由于边框不是纯黑色且与内部灰色边框混合在一起,因此这种方法仍然会留下一些暗像素。而且图片本身非常小。
如果您有更高质量或更大的源图像,或者可以在修改后缩小大小,则会得到更好的结果。
如果您只能使用这些小图像(或者您想使用另一种方法),我建议采用不同的方法,创建自己的掩码形状,该形状仅比原始照片略小,然后添加回自己的灰色边框。下面是一个示例过程。
使用此方法的可能命令如下:
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从原始图像中“挖出”形状
-compose src-over
: 将合成方法重置为简单叠加
new-border.png -composite
: 叠加一个灰色边框(png是一个3像素宽的边框,位于遮罩边缘的每侧1像素,背景透明)
clean-result.png
: 输出图像
我在Photoshop中创建了mask.png和new-border.png。您可以使用Imagemagick的向量工具,在仅使用original.jpg的情况下一次完成所有操作,但这并不容易。
上述操作的结果如下:
最后提醒一下,我不确定您是使用PHP Imagick还是命令行中的Imagemagick。几年前,我尝试使用Imagick,但很快就因文档不足而感到沮丧,相比之下命令行更易用(也许现在已经改变了)。因此,我从PHP中执行命令(例如,从exec()
或passthru()
)。有些人可能会告诉你永远不要从PHP中执行shell命令,但只要小心地转义任何参数,我还没有看到过阻止这样做的有力论据。然后您将可以使用整个Imagemagick文档(http://www.imagemagick.org/Usage/)。
干杯。