我正在尝试使用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 55
值R=200 G=150 B=100
,结果PNG
应该有相同的值 R=200 G=150 B=100
在相同的索引位置55
。此外,该图像中未使用的索引值也应该以相同的值保留在相同的索引位置(原因是它们稍后将由第三方代码使用,该代码具有覆盖中使用的像素的硬编码索引值)
本质上,我想完整的调色板保持完全相同转换时TGA
-> PNG
-> TGA
。
imagemagick 可以做到这一点以及如何做到(或者如果不能,是否有其他方法可以替代我自己的工具)? (我尝试使用其他一些选项,例如-colors 256
,等-remap a.tga
,png8:
但无济于事)
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.35
package 作为替代方案,虽然它似乎不适用于我的 TGA 文件(尽管它声称可以),但它确实提供了部分解决方案。
最后,结合 ImageMagick 和 GraphicsMagick 实现了这一点,生成了与此管道PNG
中相同调色板的颜色索引:TGA
convert a.tga tiff:- | gm convert - a.png
这很笨拙,但很有效。如果有人有的话,我仍然希望看到更清洁的解决方案......