在 Imagemagick 中创建的透明 PNG 在 FFMPEG 中绘制为不透明

Posted

技术标签:

【中文标题】在 Imagemagick 中创建的透明 PNG 在 FFMPEG 中绘制为不透明【英文标题】:Transparent PNG created in Imagemagick drawn as opaque in FFMPEG 【发布时间】:2015-02-22 20:14:14 【问题描述】:

我正在尝试使用 ImageMagick 编写视频创建脚本,以创建一些叠加层,然后将其放置在视频顶部。

如果我尝试直接使用 ImageMagick 创建的图像,透明度将被绘制为不透明。

我使用 ImageMagick 绘制命令创建了一个透明的 PNG。当加载到 GIMP 并检查时,PNG 有一个 alpha 通道,并且每个透明像素似乎都具有透明度:RGBA = 0,0,0,0

该图像在 ffmpeg 中用作叠加层时,在视频中只是具有不透明的黑色背景。

如果我再次从 GIMP 导出图像,则文件看起来相同,但在视频中仅显示为纯蓝色(叠加图像中的绘图颜色)。

我可以通过获取覆盖图像,将其加载到 GIMP 中,然后选择所有图像并从剪贴板创建一个新图像并将其导出(使用与我之前重新导出时完全相同的设置而不创建新文件)来解决此问题) 然后它将完全按照需要工作,显示覆盖的不透明部分而不显示透明部分。

关键问题:

如何在 GIMP 中创建新文件时以某种方式发生的转换编写脚本,或者(更好)一开始就不会出错?

这是两个文件:

破碎: 作品: 有什么区别?

【问题讨论】:

为什么不将 ImageMagick 中的图像直接转移到 ffmpeg 并避免 gimp 如果这样搞砸了? 对不起,如果我不清楚,但我的意思是 ImageMagick 的原始 png 输出已损坏,从 GIMP 打开并重新导出的 png 更加损坏,但是最后的工作是全选并复制并粘贴到GIMP中的新图像中。我只开始使用 GIMP 一次(没有明显原因)ImageMagic 输出变得无法使用。 我不在我的 Mac 上进行测试,但尝试在 ImageMagick 中的输出文件名前面加上 PNG32: 就像这样 convert xyz.png ... PNG32:output.png 是的,看起来很有效,太棒了。如果您将其作为答案,我会接受。 【参考方案1】:

我建议您在使用 ImageMagick 时在输出文件名前加上 PNG32: 以强制它生成 32 位 ber 像素图像 - 即 R、G、B 和 Alpha 各 1 个字节,并希望 ffmpeg 更快乐用那个。

convert input.png -draw ... PNG32:output.png

如果您在损坏的图像和工作图像上运行 identify -verbose(也在 ImageMagick 套件中),您会发现主要区别在于工作图像具有 color-type=6bit-depth=8,而损坏的图像具有 @ 987654328@和bit-depth=4

【讨论】:

我最初在 ImageMagick 中将叠加层创建为一个 PNG 图像并使用 -define png:color-type=6。然后,当命令行变得太长时,我开始通过一次组合几百个矩形的图像来创建叠加层,但合成文件不是使用该选项制作的。尽管原件的质量设置有所不同,但 ImageMagick 似乎决定将合成保存为最简单的东西。 添加 PNG32: 前缀解决了我使用 ffmpeg 使用 PNG 序列作为输入并使用 ffmpeg 覆盖过滤器弄乱时基时遇到的另一个问题。 ffmpeg 将 PNG 解释为 ya8,这会在 filtergraph 中搞砸,但强制它们为 PNG32 修复了它。

以上是关于在 Imagemagick 中创建的透明 PNG 在 FFMPEG 中绘制为不透明的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 imagemagick 将透明 png 旋转 45 度并保持新图像透明?

perl imagemagick中的png水印,使png透明

使用 ImageMagick/convert 创建半透明 PNG

Imagemagick 将透明图像裁剪为蒙版

Imagemagick 旋转透明图像上不需要的黑色背景

ImageMagick - 沿内部非透明对象边框分割透明度图像