Если ваше изображение в формате 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, на которую он отвечает ...
Здесь возможноработать вокруг.Если вы не создаете с помощью 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 .