ImageMagick - 如何在 .PNG 中保留精确的调色板

ImageMagick - 如何在 .PNG 中保留精确的调色板

我正在尝试使用convert(1)from ImageMagick 来转换为.tga.png稍后再返回),而保留精确的调色板那个被使用了。

源图像是 TARGA 颜色索引文件,具有标准 8 位 256 色调色板到 24 位 RGB 值。在这 256 种颜色中,有 239 种颜色实际上用于图像中的像素值。

然而,使用 simple convert a.tga a.png,创建 PNG 会删除未使用的调色板颜色,并且其他调色板值也会更改其索引。转换为.tiff.gif工作正常,默认情况下保留调色板(我已使用 手动验证颜色图identify -verbose a.tiff

% identify a.png a.tga a.tif a.gif
a.png PNG 320x200 320x200+0+0 8-bit sRGB 239c 29549B 0.000u 0:00.000
a.tga TGA 320x200 320x200+0+0 8-bit sRGB 256c 64790B 0.000u 0:00.000
a.tif TIFF 320x200 320x200+0+0 8-bit sRGB 256c 65818B 0.000u 0:00.000
a.gif GIF 320x200 320x200+0+0 8-bit sRGB 256c 29830B 0.000u 0:00.000

我希望调色板保持完全相同(例如,如果有TGA index 55R=200 G=150 B=100,结果PNG应该有相同的R=200 G=150 B=100相同的索引位置55。此外,该图像中未使用的索引值也应该以相同的值保留在相同的索引位置(原因是它们稍后将由第三方代码使用,该代码具有覆盖中使用的像素的硬编码索引值)

本质上,我想完整的调色板保持完全相同转换时TGA-> PNG-> TGA

imagemagick 可以做到这一点以及如何做到(或者如果不能,是否有其他方法可以替代我自己的工具)? (我尝试使用其他一些选项,例如-colors 256,等-remap a.tgapng8:但无济于事)

ImageMagick 6.9.10-23 Q16如果有必要的话,我正在使用 Debian Buster 。

更新:似乎有一个选项-定义 png:保留颜色图=true这听起来就像我想要的东西,但在使用调色板时似乎不起作用?!

% convert a.tga -define png:preserve-colormap=true png8:a.png
convert-im6.q16: Valid palette required for paletted images `a.png' @ error/png.c/MagickPNGErrorHandler/1641.

(它可以在没有 的情况下工作png8:,但随后它会创建 Truecolor PNG(color_type:2;不带调色板)而不是索引(color_type: 3;带调色板),这违背了目的......

答案1

这个问题信息丰富,并且还提供了令人惊讶的简单 Perl 脚本解决方法 PNG writer,可以在我用完选项时手动解决问题。

但是,我尝试过使用GraphicsMagick 1.3.35package 作为替代方案,虽然它似乎不适用于我的 TGA 文件(尽管它声称可以),但它确实提供了部分解决方案。

最后,结合 ImageMagick 和 GraphicsMagick 实现了这一点,生成了与此管道PNG中相同调色板的颜色索引:TGA

convert a.tga tiff:- | gm convert - a.png

这很笨拙,但很有效。如果有人有的话,我仍然希望看到更清洁的解决方案......

相关内容