Как получить цветовое пространство с помощью CImg изображения, загруженного с помощью CImg? - PullRequest
0 голосов
/ 16 мая 2018

Я загружаю изображение с помощью CIMG, например:

CImg<unsigned char> image("lena.png");

Как узнать, например, что четыре канала этого изображения представляют цвета RGBA, а не CMYK?Я знаю, что CImg<>::spectrum() дает мне количество каналов, но даже в документации говорится "Значение значений пикселей не связано с количеством каналов (например, 4-канальное изображение может равнодушно обозначать RGBA илиЦветное изображение CMYK) ".

Я искал документацию и учебные пособия, но, похоже, не было функции, чтобы сообщить мне значение данных канала.

Итак, как узнать, с какими данными я работаю?Могу ли я просто предположить, что все недавно загруженные изображения находятся в RGB или RGBA?

1 Ответ

0 голосов
/ 16 мая 2018

Если ваше изображение в формате PNG, оно обязательно RGB или RGBA, поскольку PNG не поддерживает CMYK.

Если это JPEG, я бы предположил, что оно находится в цветовом пространстве sRGB, но вы можете проверить с помощьюСначала ImageMagick , используя:

identify -format "%[colorspace]" YourImage.xxx

Я сгенерировал изображение CMYK с помощью Imagemagick и загрузил его с помощью CImg .По-видимому, он не выполняет никакого преобразования в результате цветового пространства и просто возвращает первый байт каждого пикселя как красный (хотя в действительности он голубой), второй - как зеленый (хотя он пурпурный) и так далее ...

Я также скомпилировал CImg с отладочной информацией, с cimg_use_jpeg, определенным как 1 (поэтому он использует libjpeg), и пошагово прошел через него. может видеть в jpeg_info_struct в функции _load_jpeg, что изображение является CMYK, но игнорирует эту информацию - я полагаю, вы могли бы исправить CImg и довольно легко изменить глобальную переменную, чтобы сохранить пространство цвета- если вы любите взламывать!Или вы можете попросить Дэвида Чумперле сделать это через страницу GitHub CImg, на которую он отвечает ...

enter image description here


Здесь возможноработать вокруг.Если вы не создаете с помощью cimg_use_jpeg, или cimg_use_png, или cimg_use_tiff, CImg делегирует файлы для чтения инструменту командной строки ImageMagick , называемому convert,Затем он преобразует ваше изображение в формат PNM (в трубе, а не на диске), и CImg будет считывать данные из трубы.Важно отметить, что ImageMagick всегда преобразует записываемые изображения в формат PNM в цветовое пространство sRGB, поэтому, если у вас есть ImageMagick , преобразуйте ваши изображения (без использования встроенных CImg в библиотеках), ваши изображения всегда будут читаться в цветовом пространстве sRGB.По сути, CImg делает это для чтения файлов при делегировании ImageMagick :

convert input.jpg pnm:-

и читает вывод.

Вы заметите, что ваш4-канальное (ранее CMYK) изображение внезапно становится 3-канальным (теперь sRGB), когда CImg делегировано ImageMagick , поскольку выходные данные из ImageMagick являютсяобязательно 3-канальный файл PNM.


Если вы хотите пойти еще дальше ...

Если вы установите переменную среды, вы можете указать, где CImg ищет convert, так что вы можете указать его на свою "оболочку" вокруг реального ImageMagick convert.

Таким образом, в конкретных терминах, если вы делаете:

export cimg_convert_path="/Users/YourUser/bin/convertWrapper"

перед выполнением чего-либо с CImg в нем или в начале вашей программы с помощью:

setenv("cimg_convert_path","/Users/YourUser/bin/convertWrapper",1);

CImg запустит следующую команду для загрузки ваших файлов:

/Users/YourUser/bin/convertWrapper input.jpg pnm:-

Итак, я предлагаю, чтобы в этом файле оболочки вы могли изменить параметрыпередается convert, так что на самом деле он делает что-то еще:

convert input.jpg -auto-level pnm:-

Итак, convertWrapper будет содержать:

#!/bin/bash

# Pick up arguments and put in array
args=( "$@" )

# Remove last argument ("pnm:-")
unset 'args[${#args[@]}-1]'

# Add our "-auto-level" parameter in before last item
args+=("-auto-level")

# Re-append "pnm:-"
args+=("pnm:-")

# Debug output to /tmp/a
echo "BEFORE: $@"         >> /tmp/a
echo "AFTER:  ${args[@]}" >> /tmp/a

# Call real "convert" with modified parameters
/usr/local/bin/magick "${args[@]}"

Этот подход означает, что вам не нужно изменять CImg .

...