如何将 PNG 图像(特别是灰度图像)转换为索引颜色
How to convert PNG images (specifically grayscale ones) to Indexed color
我正在尝试将一些小的 PNG 图像从 32 位颜色模式转换为索引颜色模式。
对于彩色图像,我 运行 命令 convert IMGS/FLAME.png INDEXED_IMGS/FLAME.png
并且它转换得很好。对于只有灰度颜色的图像,我 运行 使用相同的命令(文件名明显更改)但我收到警告:
convert: profile 'icc': 'RGB ': RGB color space not permitted on grayscale PNG 'INDEXED_IMGS/SHADOW.png' @ warning/png.c/MagickPNGWarningHandler/1748.
我运行file 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 中创建它们的模式)。但是,当我 运行 file INDEXED_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
...
如果您添加 -colorspace gray,ImageMagick 仍将报告为 grayscalealpha 类型,因为它将其识别为具有透明度的单通道图像。但是使用EXIFTOOL,会报9 ColorType: 3
,也就是3 = RGB Palette
注意:对于 ImageMagick 7,将 convert 更改为 magick。
我正在尝试将一些小的 PNG 图像从 32 位颜色模式转换为索引颜色模式。
对于彩色图像,我 运行 命令 convert IMGS/FLAME.png INDEXED_IMGS/FLAME.png
并且它转换得很好。对于只有灰度颜色的图像,我 运行 使用相同的命令(文件名明显更改)但我收到警告:
convert: profile 'icc': 'RGB ': RGB color space not permitted on grayscale PNG 'INDEXED_IMGS/SHADOW.png' @ warning/png.c/MagickPNGWarningHandler/1748.
我运行file 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 中创建它们的模式)。但是,当我 运行 file INDEXED_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
...
如果您添加 -colorspace gray,ImageMagick 仍将报告为 grayscalealpha 类型,因为它将其识别为具有透明度的单通道图像。但是使用EXIFTOOL,会报9 ColorType: 3
,也就是3 = RGB Palette
注意:对于 ImageMagick 7,将 convert 更改为 magick。