我正在用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é这样做,他确实会回应...

c&#43;&#43; - 如何使用CImg检索已加载CImg的图像的色彩空间?-LMLPHP



这是一个可能的解决方法。如果您不使用cimg_use_jpegcimg_use_pngcimg_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/

10-12 22:12