Skip to content
MagickCmd报错 › 透明 PNG 转成 JPEG 后背景变黑

透明 PNG 转成 JPEG 后背景变黑

JPEG 没有 alpha 通道,透明像素底下存的 RGB 值会露出来,通常是黑色。正确的 -alpha remove 解法,以及为什么 -flatten 有时会出问题。

你把带透明的 PNG 转成 JPEG,透明区域全变成了纯黑:

magick logo.png logo.jpg    # 透明背景 → 黑色

为什么

JPEG 没有 alpha 通道。ImageMagick 丢掉 alpha 时,底下的 RGB 值依然在 —— 而设计软件导出的 PNG 里,完全透明的像素通常存的就是黑色加零透明度。丢掉 alpha,黑色就露出来了。

这不是 ImageMagick 的问题。任何没被明确告知背景色就压平图像的工具都会这样。

解决

magick logo.png -background white -alpha remove -alpha off logo.jpg

依次是:

  • -background white —— 要合成到的颜色。这是设置类参数,所以必须写在使用它的操作前面
  • -alpha remove —— 把图合成到那个背景上。
  • -alpha off —— 丢掉已经多余的通道,让文件更小。

为什么不用 -flatten

magick logo.png -background white -flatten logo.jpg

这通常也能用,而且到处都能看到有人这么推荐。区别在于 -flatten 还会合并图层偏移。如果这张 PNG 带着虚拟画布 —— 裁切之后非常常见,GIF 帧更是标配 —— -flatten 会按那个偏移摆放图片,结果就是莫名其妙的留白或者位置整体挪了。

-alpha remove 只动 alpha 通道,所以更可预测。真要用 -flatten 的话,先加个 +repage

换任意背景色

magick logo.png -background '#0d9488' -alpha remove -alpha off out.jpg
magick logo.png -background none -alpha remove -alpha off out.png

批量处理整个文件夹

mkdir -p jpg
for f in *.png; do
  magick "$f" -background white -alpha remove -alpha off \
    -quality 88 "jpg/${f%.png}.jpg"
done

几个同源的问题

  • 圆角变黑。 同一个原因 —— 圆角遮罩存在 alpha 通道里。改成输出 PNG 或 WebP。
  • PDF 页面渲染成黑色。 PDF 页面的背景是透明的,直接转 JPEG 也是同样结果。加 -background white -alpha remove。见 PDF 那一页
  • 变成白色而不是黑色。 有些 PNG 编码器在透明像素下面存的是白色。解法一样 —— 你是在把结果变成明确指定的,而不是依赖编码器碰巧存了什么。

转之前先检查

magick identify -format '%A %[opaque]\n' logo.png

第一个值表示是否存在 alpha 通道,第二个表示是否每个像素都不透明。两者可能不一致 —— 一个文件可以带着完全不透明的 alpha 通道,这种情况直接转 JPEG 是安全的。


相关页面

Copied