首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用CImg检索带有CImg的图像的颜色空间?

如何用CImg检索带有CImg的图像的颜色空间?
EN

Stack Overflow用户
提问于 2018-05-16 14:53:51
回答 1查看 745关注 0票数 0

我正在用CIMG加载一个图像,如下所示:

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

我如何知道该图像的四个通道表示RGBA颜色,而不是CMYK?我知道CImg<>::spectrum()给出了频道的数量,但甚至文档也说“像素值的含义与频道的数量没有关联(例如,4通道图像可能代表RGBA或CMYK彩色图像)”。

我已经搜索了文档和教程,但是似乎没有功能告诉我通道数据的含义.

那么,我怎么知道我正在处理的数据呢?我可以假设所有新加载的图像都在RGB或RGBA中吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-16 15:02:31

如果您的图像是PNG格式的,则必须是RGB或RGBA,因为PNG不支持CMYK。

如果是JPEG,我假设它在sRGB颜色空间中,但是您可以首先使用以下方法检查ImageMagick

代码语言:javascript
复制
identify -format "%[colorspace]" YourImage.xxx

我使用Imagemagick生成了一个CMYK映像,并使用CImg加载了它。它似乎不执行任何转换作为颜色空间的结果,只返回每个像素的第一个字节为红色(虽然它在现实中是青色),第二个作为绿色(虽然它是洋红色)等等……

我还用调试信息编译了CImgcimg_use_jpeg定义为1 (因此它使用了libjpeg),并逐步完成了它。它可以在jpeg_info_struct in function _load_jpeg中看到图像是CMYK,但是它忽略了这个信息--我猜您可以修补CImg并修改一个全局变量来很容易地存储颜色空间--如果您喜欢的话!或者你可以通过CImg GitHub页面请求é这样做,他确实回复了.

这里有一个可能的解决办法。如果不使用cimg_use_jpegcimg_use_pngcimg_use_tiff构建,CImg将将读取文件委托给名为convertcimg_use_jpeg命令行工具。然后,它将图像转换为PNM格式(在管道中,而不是在磁盘上),CImg将从管道中读取数据。至关重要的是,ImageMagick总是将正在写入PNM格式的图像转换为sRGB颜色空间,因此如果您让ImageMagick转换您的图像(通过不使用CImg的内置库),您的图像将始终在sRGB颜色空间中读取。实际上,CImg在将文件委托给ImageMagick时这样做是为了读取文件。

代码语言:javascript
复制
convert input.jpg pnm:-

并读取输出。

您将注意到,当sRGB CImg委托给ImageMagick时,您的4通道(以前的CMYK)映像突然变成了3通道(现在的CMYK)图像,因为ImageMagick的输出是一个,必然是3通道的PNM文件。

如果你想更进一步..。

如果设置了一个环境变量,则可以控制CImg查找convert的位置,这样就可以将其指向真实的ImageMagick convert周围的自己的“包装器”。

因此,具体地说,如果你这样做了:

代码语言:javascript
复制
export cimg_convert_path="/Users/YourUser/bin/convertWrapper"

在运行包含CImg的任何内容之前,或在程序开始时,使用:

代码语言:javascript
复制
setenv("cimg_convert_path","/Users/YourUser/bin/convertWrapper",1);

CImg将运行以下命令来加载文件:

代码语言:javascript
复制
/Users/YourUser/bin/convertWrapper input.jpg pnm:-

因此,我建议在那个包装文件中,您可以修改传递给convert的参数,这样它实际上可以执行其他操作:

代码语言:javascript
复制
convert input.jpg -auto-level pnm:-

因此,convertWrapper将包含:

代码语言:javascript
复制
#!/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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50374103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档