我正在用CIMG加载图像,如下所示:CImg<unsigned char> image("lena.png");
我怎么知道例如该图像的四个通道代表RGBA颜色而不是CMYK?我知道CImg<>::spectrum()
会给我提供通道数量,但是即使文档中也说“像素值的含义与通道数量没有关系(例如4通道图像可能无异于代表RGBA或CMYK彩色图像)”。
我已经搜索了文档和教程,但是似乎没有任何功能可以告诉我通道数据的含义。
那么,我如何知道正在使用的数据类型?我可以假设所有新加载的图像都在RGB或RGBA中吗?
最佳答案
如果您的图片为PNG格式,则必须为RGB或RGBA,因为PNG不支持CMYK。
如果它是JPEG,则假定它是sRGB色彩空间,但是您可以使用以下方法首先使用ImageMagick进行检查:
identify -format "%[colorspace]" YourImage.xxx
我使用Imagemagick生成了CMYK图像,并使用CImg加载了它。由于色彩空间的原因,它似乎不执行任何转换,仅将每个像素的第一个字节返回为红色(实际上是青色),第二个返回为绿色(虽然是洋红色),依此类推...
我还使用调试信息编译了CImg,将
cimg_use_jpeg
定义为1
(因此它使用了libjpeg
),并逐步进行了调试。它可以在函数jpeg_info_struct
中的_load_jpeg
中看到图像是CMYK,但是它忽略了此信息-我想您可以修补CImg
并很容易地修改全局变量以存储色彩空间-如果您喜欢破解!或者,您可以通过CImg GitHub页面请求DavidTschumperlé这样做,他确实会回应...这是一个可能的解决方法。如果您不使用
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:-
并读取输出。
您会注意到,当CImg委托给ImageMagick时,您的4通道(以前为CMYK)图像突然变成了3通道(现在为sRGB)图像,因为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。
关于c++ - 如何使用CImg检索已加载CImg的图像的色彩空间?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50374103/