How to get rgb value by cimg?

前端 未结 4 2029
野性不改
野性不改 2020-12-16 05:43
CImg src(\"image.jpg\");
int width = src.width();
int height = src.height();
unsigned char* ptr = src.data(10,10); 

How can I

相关标签:
4条回答
  • 2020-12-16 05:51

    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.

    0 讨论(0)
  • 2020-12-16 05:51

    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];
    
    0 讨论(0)
  • 2020-12-16 05:54

    @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...

    0 讨论(0)
  • 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);
    
    0 讨论(0)
提交回复
热议问题