Imagick. 将颜色变为透明

4
我想使用PHP中的Imagick将此图像的黑色边框更改为透明。 http://dev.loungeup.net/im/ 结果图像应该显示灰色边框和灰色边框内的图像,而灰色边框外的一切(今天是黑色的)都应该是透明的,并且让底层内容(例如HTML页面)可见。
我已经多次阅读了文档并尝试了几个解决方案,但没有弄清楚如何实现。
任何帮助都会受到赞赏。
谢谢
1个回答

14

这里有一个与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: 输出图像

这是结果: Imagemagick Method 1

不幸的是,如你所见,由于边框不是纯黑色且与内部灰色边框混合在一起,因此这种方法仍然会留下一些暗像素。而且图片本身非常小。

如果您有更高质量或更大的源图像,或者可以在修改后缩小大小,则会得到更好的结果。

如果您只能使用这些小图像(或者您想使用另一种方法),我建议采用不同的方法,创建自己的掩码形状,该形状仅比原始照片略小,然后添加回自己的灰色边框。下面是一个示例过程。

使用此方法的可能命令如下:

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的情况下一次完成所有操作,但这并不容易。

上述操作的结果如下: Imagemagick Method 2

最后提醒一下,我不确定您是使用PHP Imagick还是命令行中的Imagemagick。几年前,我尝试使用Imagick,但很快就因文档不足而感到沮丧,相比之下命令行更易用(也许现在已经改变了)。因此,我从PHP中执行命令(例如,从exec()passthru())。有些人可能会告诉你永远不要从PHP中执行shell命令,但只要小心地转义任何参数,我还没有看到过阻止这样做的有力论据。然后您将可以使用整个Imagemagick文档(http://www.imagemagick.org/Usage/)。

干杯。


你知道如何在不知道图形大小的情况下从右下角开始进行泛洪填充吗? - alfC
1
@alfC 旋转180度,进行泛洪填充,然后再旋转回来 :-) - Mark Setchell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接