background - ImageMagick 使用部分透明像素的背景颜色转换为 png8(带有二进制 alpha 的调色板 PNG)

标签 background imagemagick png transparency alphablending

我有一个像这样的 32 位 PNG 图像:

32-bit

此处显示棋盘背景以提高可见性,但图像实际上不是棋盘而是透明的(供您引用: the original 32-bit image )。正如您所看到的,在边缘周围和向右,红色像素逐渐从不透明淡出为透明。

如果我在蓝色背景上显示这个 32 位图像,边缘周围和右侧的像素会逐渐从红色褪成蓝色。

现在我需要将此图像转换为带有二进制 alpha 的 8 位 PNG。我希望完全透明的区域保持完全透明,但部分透明的像素逐渐与预期的背景/ mask 颜色混合,在本例中为蓝色。

所以像这样:

8-bit blended with background color

但是,我似乎不知道如何使用 ImageMagick 执行此操作(在 Mac 上使用 ImageMagick 7.0.8-26)。我尝试如下:

magick original.png -background 'rgba(0,0,255,0)' png8:output.png

但这会导致:

8-bit with background color ignored

它似乎完全忽略了蓝色背景颜色,只是将透明度转换为二进制(可能对于 ≥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

output

第二个选项

将透明色替换为蓝色,然后调用 -transparent,而不进行任何 -fuzz 操作。

magick original.png \( \
  +clone -fill BLUE -draw 'color 0,0 reset' \) \
  -compose DstOver -composite -transparent BLUE \
  PNG8:output.png

output

我再次确信上面的例子可以改进。 YMMV

关于background - ImageMagick 使用部分透明像素的背景颜色转换为 png8(带有二进制 alpha 的调色板 PNG),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56687653/

相关文章:

css - 无法定位第二个背景图像

css - 使用 SVG 平铺时只显示一次组

java - 背景颜色和大小相等的 jradiobuttons

php - 我无法使用 imagecreatefrompng() 打开此 PNG 文件

python - 如何在 Python 中将自定义信息保存到 PNG 图像文件?

macos - 使用 Matlab 和其他程序在 Mac 上导出 PNG 时出现白线

ios - 应用程序在使用 BKProcessAssertion 进行远程推送时崩溃

javascript - node.js 到 imagemagick 命令中断

ruby - 如何在 rails 3.01 中强制构建出售的 gem - 出售时的 rmagick 问题

php - GD vs ImageMagick vs Gmagick for jpg?