Imagemagick 如何将PNG图像(特别是灰度图像)转换为索引颜色

Imagemagick 如何将PNG图像(特别是灰度图像)转换为索引颜色,imagemagick,imagemagick-convert,Imagemagick,Imagemagick Convert,我正在尝试将一些小PNG图像从32位颜色模式转换为索引颜色模式 对于彩色图像,我运行了命令convert IMGS/FLAME.png\u IMGS/FLAME.png,它转换得很好。对于只有灰度颜色的图像,我运行了相同的命令(文件名已明显更改),但得到了一个警告: convert: profile 'icc': 'RGB ': RGB color space not permitted on grayscale PNG 'INDEXED_IMGS/SHADOW.png' @ warning/p

我正在尝试将一些小PNG图像从32位颜色模式转换为索引颜色模式

对于彩色图像,我运行了命令
convert IMGS/FLAME.png\u IMGS/FLAME.png
,它转换得很好。对于只有灰度颜色的图像,我运行了相同的命令(文件名已明显更改),但得到了一个警告:

convert: profile 'icc': 'RGB ': RGB color space not permitted on grayscale PNG 'INDEXED_IMGS/SHADOW.png' @ warning/png.c/MagickPNGWarningHandler/1748.
我运行了
文件IMGS/*.png
并获得了

IMGS/FLAME.png:  PNG image data, 16 x 16, 8-bit/color RGBA, non-interlaced
IMGS/SHADOW.png: PNG image data, 8 x 8, 8-bit/color RGBA, non-interlaced
这是意料之中的;这两幅图像都处于8位RGBA模式(因为这是我在Photoshop中创建它们的模式)。但是,当我运行
文件索引\u IMGS/*.png

INDEXED_IMGS/FLAME.png:  PNG image data, 16 x 16, 4-bit colormap, non-interlaced
INDEXED_IMGS/SHADOW.png: PNG image data, 8 x 8, 8-bit grayscale, non-interlaced
4位彩色贴图部分检出,但灰度部分不检出

所以我的问题是:如何将灰度图像转换为索引模式?真正让我感兴趣的是,它像彩色图像一样以RGBA模式启动,但出于某种原因,它会自动转换为灰度模式。有没有办法防止它这样做

我应该补充一点,我有一个bash脚本,如下所示:

#!/bin/bash

for img in IMGS/*.png; do
    file=$(basename $img)
    convert $img INDEXED_IMGS/$file
done
所以我不想手动区分灰度图像和彩色图像。如果有一种方法可以通过一些命令自动完成,那也没关系

以下是有关我的ImageMagick工具的信息:

Version: ImageMagick 7.0.8-42 Q16 x86_64 2019-04-24 https://imagemagick.org
Copyright: © 1999-2019 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI Modules OpenMP 
Delegates (built-in): bzlib freetype heic jng jp2 jpeg lcms ltdl lzma openexr png tiff webp xml zlib

对于ImageMagick,对于24位颜色,使用PNG8:output附加输出

convert input.png PNG8:output.png

PNG灰度图像不支持颜色配置文件,因此您会收到该警告。但是生成的图像应该是8位调色板

如果您有32位颜色,那么这需要做更多的工作。alpha通道下的颜色必须是一种恒定颜色,并且在图像中的其他位置未使用。在转换为256色后找到这样的颜色,并将透明度下的颜色设置为该颜色。例如,如果在转换为256色后图像中没有不透明黑色,则将alpha基色设置为黑色

convert image.png +dither -colors 256 -background black -alpha background PNG8:output.png

您可以从图像中获得独特颜色的列表,如下所示:

convert image.png +dither -colors 256 -unique-colors txt:

以下是一个例子:

将其设置为32位透明:

convert rose.png -fuzz 20% -transparent red rose_trans32.png

identify -verbose rose_trans32.png
...
 Colorspace: sRGB
 Type: TrueColorAlpha
...

转换为调色板alpha:

convert rose_trans32.png -alpha off +dither -colors 256 -unique-colors txt:

List shows no black

convert rose_trans32.png +dither -colors 256 -background black -alpha background PNG8:rose_trans8.png

Or if you already know that the 32-bit version has not black, then just:

convert rose_trans32.png -background black -alpha background PNG8:rose_trans8.png

identify -verbose rose_trans8.png
...
  Colorspace: sRGB
  Type: PaletteAlpha
...

如果您添加颜色空间灰色,ImageMagick仍将报告为类型grayscalealpha,因为它将其识别为具有透明度的单通道图像。但使用EXIFTOOL,它将报告
9 ColorType:3
,即
3=RGB调色板

注意:对于ImageMagick 7,将转换为magick