Как преобразовать изображения в формате PNG (особенно в оттенках серого) в индексированный цвет - PullRequest
1 голос
/ 27 апреля 2019

Я пытаюсь преобразовать несколько небольших изображений 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-битная часть цветовой карты проверяется, а часть оттенков серого - нет.

Так что мой вопросis: как я могу преобразовать изображение в градациях серого в индексированный режим? Что меня действительно привлекает, так это то, что оно запускается в режиме 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

1 Ответ

1 голос
/ 27 апреля 2019

С помощью ImageMagick для 24-битного цвета добавьте вывод в PNG8: вывод

convert input.png PNG8:output.png


Изображения в градациях серого в формате PNG не поддерживают цветовые профили, поэтому вы получите это предупреждение. Но получившееся изображение должно быть 8-битной палитрой.

Если у вас 32-битный цвет, то для этого нужно сделать больше. Цвет под альфа-каналом должен быть одним постоянным и не использоваться в других местах изображения. Найдите такой цвет после преобразования в 256 цветов и установите цвет под прозрачность для этого цвета. Например, если у вас нет непрозрачного черного цвета в изображении после преобразования в 256 цветов, тогда установите базовый альфа-цвет на черный.

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


Вы можете получить список уникальных цветов из изображения следующим образом:

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


Вот пример:

enter image description here

Сделать его 32-битным прозрачным:

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

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


enter image description here

Преобразовать в палитру альфа:

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
...


enter image description here

Если вы добавите -colorspace grey, ImageMagick по-прежнему будет отображать тип grayscalealpha, поскольку он распознает его как одноканальное изображение с прозрачностью. Но, используя EXIFTOOL, он сообщит 9 ColorType: 3, что составляет 3 = RGB Palette

ПРИМЕЧАНИЕ. Для ImageMagick 7 измените преобразование в магическое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...