简体   繁体   English

如何通过cimg获得rgb值?

[英]How to get rgb value by cimg?

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 ? 我如何从ptr获得rgb

Tested on Ubuntu 10.04 with a handmade 3x3 RGB image saved as test.png : 在Ubuntu 10.04上测试,手工制作的3x3 RGB图像保存为test.png

sudo apt-get install cimg-dev

Source file cimg_test.cpp : 源文件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. 有用。

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: CImg文档 - 第34页的第6.13节和第120页的第8.1.4.16节 - 看起来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)

...where c refers to the color channel. ...其中c指的是颜色通道。 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. 我猜测如果你的图像确实是一个RGB图像,那么对c使用0,1或2的值将给出给定x, y位置的红色,绿色和蓝色分量。

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: 它看起来像CImg的operator()以类似的方式工作:

unsigned char r = src(10, 10, 0, 0);

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. 你可能会感到困惑,因为CImg存储了非交错的原始数据。 ie 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 即您的原始数据存储R1, R2, ..., G1, G2, ..., B1, B2, ...而不是R1, G1, B1, R2, G2, B2, ...请参阅: http: //cimg.eu/reference/group__cimg__storage.html

.data() just returns a pointer, so to access the data directly as above you would do: .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: I don't know about CImg but grayscale images in RGB have: @wamp:我不知道CImg,但RGB中的灰度图像有:

R = G = B R = G = B.

and in CMYK: 在CMYK:

C = M = Y = 0 C = M = Y = 0

K = luminance K =亮度

So you don't even need a function for that... 所以你甚至不需要一个功能......

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM