问题
CImg<unsigned char> src("image.jpg");
int width = src.width();
int height = src.height();
unsigned char* ptr = src.data(10,10);
How can I get rgb
from ptr
?
回答1:
From the CImg documentation -- section 6.13 on page 34, and section 8.1.4.16 on page 120 -- it looks like the data
method can take four arguments: x, y, z, and c:
T* data(const unsigned int x, const unsigned int y = 0,
const unsigned int z = 0, const unsigned int c = 0)
...where c
refers to the color channel. I'm guessing that if your image is indeed an RGB image, then using values of 0, 1, or 2 for c
will give you the red, green, and blue components at a given x, y
location.
For example:
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);
(But this is just a guess!)
Edit:
It looks like there's also an operator() for CImg that works in a similar manner:
unsigned char r = src(10, 10, 0, 0);
回答2:
Tested on Ubuntu 10.04 with a handmade 3x3 RGB image saved as test.png
:
sudo apt-get install cimg-dev
Source file 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;
}
Compile and run:
g++ cimg_test.cpp -lX11 -lpthread -o cimg_test ./cimg_test 3x3 (0,0) = R0 G0 B0 (0,1) = R255 G0 B0 (0,2) = R0 G255 B0 (1,0) = R0 G0 B255 (1,1) = R128 G128 B128 (1,2) = R0 G0 B128 (2,0) = R128 G0 B0 (2,1) = R0 G128 B0 (2,2) = R255 G255 B255
It works.
回答3:
The easiest way to access data is with the ()
operator:
unsigned char r = img(10,10,0,0);
unsigned char g = img(10,10,0,1);
unsigned char b = img(10,10,0,2);
You are probably hitting confusion because CImg stores the raw data non-interleaved. i.e. your raw data is stored R1, R2, ..., G1, G2, ..., B1, B2, ...
instead of R1, G1, B1, R2, G2, B2, ...
see: http://cimg.eu/reference/group__cimg__storage.html
.data()
just returns a pointer, so to access the data directly as above you would do:
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];
回答4:
@wamp: I don't know about CImg but grayscale images in RGB have:
R = G = B
and in CMYK:
C = M = Y = 0
K = luminance
So you don't even need a function for that...
来源:https://stackoverflow.com/questions/3291923/how-to-get-rgb-value-by-cimg