CImg<unsigned char> src("image.jpg");
int width = src.width();
int height = src.height();
unsigned char* ptr = src.data(10,10);
我如何从ptr
中获取rgb
?
CImg<unsigned char> src("image.jpg");
int width = src.width();
int height = src.height();
unsigned char* ptr = src.data(10,10);
我如何从ptr
中获取rgb
?
在Ubuntu 10.04上测试,使用手工制作的3x3 RGB图像test.png
:
sudo apt-get install cimg-dev
源文件cimg_test.cpp
:
#include <iostream>
using namespace std;
#include <CImg.h>
using namespace cimg_library;
int main()
{
CImg<unsigned char> src("test.png");
int width = src.width();
int height = src.height();
cout << width << "x" << height << endl;
for (int r = 0; r < height; r++)
for (int c = 0; c < width; c++)
cout << "(" << r << "," << c << ") ="
<< " R" << (int)src(c,r,0,0)
<< " G" << (int)src(c,r,0,1)
<< " B" << (int)src(c,r,0,2) << endl;
return 0;
}
编译并运行:
g++ cimg_test.cpp -lX11 -lpthread -o cimg_test
./cimg_test 3x3 (0,0) = 红0 绿0 蓝0 (0,1) = 红255 绿0 蓝0 (0,2) = 红0 绿255 蓝0 (1,0) = 红0 绿0 蓝255 (1,1) = 红128 绿128 蓝128 (1,2) = 红0 绿0 蓝128 (2,0) = 红128 绿0 蓝0 (2,1) = 红0 绿128 蓝0 (2,2) = 红255 绿255 蓝255
它可以工作。
data
方法似乎可以接受四个参数:x、y、z和c。T* data(const unsigned int x, const unsigned int y = 0,
const unsigned int z = 0, const unsigned int c = 0)
...其中c
代表颜色通道。如果您的图像确实是RGB图像,则在给定的x,y
位置使用0、1或2的值将为您提供红色、绿色和蓝色组件。
例如:
unsigned char *r = src.data(10, 10, 0, 0);
unsigned char *g = src.data(10, 10, 0, 1);
unsigned char *b = src.data(10, 10, 0, 2);
(但这只是一个猜测!)
编辑:
看起来CImg还有一个operator(),工作方式类似:
unsigned char r = src(10, 10, 0, 0);
char v = src(10, 10, 0, 0);
- Nate Kohlspectrum
方法返回颜色通道的数量。因此,int numChannels = src.spectrum();
可能会将numChannels
设置为3,用于RGB图像,而对于灰度图像,它可能是1。 - Nate Kohl()
运算符:unsigned char r = img(10,10,0,0);
unsigned char g = img(10,10,0,1);
unsigned char b = img(10,10,0,2);
R1, R2, ..., G1, G2, ..., B1, B2, ...
而不是R1, G1, B1, R2, G2, B2, ...
。请参见:http://cimg.eu/reference/group__cimg__storage.html
.data()
只返回指针,因此要像上面那样直接访问数据,您需要执行以下操作:CImg<unsigned char> src("image.jpg");
int width = src.width();
int height = src.height();
unsigned char* ptr = src.data(10,10);
unsigned char r = ptr[0];
unsigned char g = ptr[0+width*height];
unsigned char b = ptr[0+2*width*height];
@wamp:我不知道CImg,但在RGB中的灰度图像具有:
R = G = B
而在CMYK中:
C = M = Y = 0
K = 亮度
所以你甚至不需要一个函数来实现这个...