我有一个像这样的 32 位 PNG 图像:
此处显示棋盘背景以提高可见性,但图像实际上不是棋盘而是透明的(供您引用: the original 32-bit image )。正如您所看到的,在边缘周围和向右,红色像素逐渐从不透明淡出为透明。
如果我在蓝色背景上显示这个 32 位图像,边缘周围和右侧的像素会逐渐从红色褪成蓝色。
现在我需要将此图像转换为带有二进制 alpha 的 8 位 PNG。我希望完全透明的区域保持完全透明,但部分透明的像素逐渐与预期的背景/ mask 颜色混合,在本例中为蓝色。
所以像这样:
但是,我似乎不知道如何使用 ImageMagick 执行此操作(在 Mac 上使用 ImageMagick 7.0.8-26)。我尝试如下:
magick original.png -background 'rgba(0,0,255,0)' png8:output.png
但这会导致:
它似乎完全忽略了蓝色背景颜色,只是将透明度转换为二进制(可能对于 ≥128 采取完全不透明或对于 <128 采取完全透明)。
此外,如果我指定 rgb(0,0,255)
作为背景颜色(即无 Alpha),结果是相同的。
ImageMagick 是否有一些我不知道的智能“部分透明像素的背景混合”选项?
否则,我猜我应该以某种方式提取一个二进制位图,其中原始图像是完全透明的(即具有 alpha 值或不透明度 0),然后将图像展平到我选择的背景上,然后重新应用再次 bool alpha 位图。但不太确定如何做到这一点。
最佳答案
我可以想到两种技术,但我相信人们有更好的答案。
第一个选项
合成蓝色背景,然后从原始源复制 Alpha channel 。
magick original.png \( \
+clone \( +clone -fill BLUE -draw 'color 0,0 reset' \) \
-compose DstOver -composite \) \
-swap 0,1 -compose CopyAlpha -composite PNG8:output.png
第二个选项
将透明色替换为蓝色,然后调用 -transparent
,而不进行任何 -fuzz
操作。
magick original.png \( \
+clone -fill BLUE -draw 'color 0,0 reset' \) \
-compose DstOver -composite -transparent BLUE \
PNG8:output.png
我再次确信上面的例子可以改进。 YMMV
关于background - ImageMagick 使用部分透明像素的背景颜色转换为 png8(带有二进制 alpha 的调色板 PNG),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56687653/