在 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=6
和 bit-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透明