Getting RGB values for each pixel from a raw image in C

后端 未结 3 1821
迷失自我
迷失自我 2021-01-02 20:46

I want to read the RGB values for each pixel from a raw image. Can someone tell me how to achieve this? Thanks for help!

the format of my raw image is .CR2 which com

3条回答
  •  梦谈多话
    2021-01-02 21:17

    Assuming the image is w * h pixels, and stored in true "packed" RGB format with no alpha component, each pixel will require three bytes.

    In memory, the first line of the image might be represented in awesome ASCII graphics like this:

       R0 G0 B0 R1 G1 B1 R2 G2 B2 ... R(w-1) G(w-1) B(w-1)
    

    Here, each Rn Gn and Bn represents a single byte, giving the red, green or blue component of pixel n of that scanline. Note that the order of the bytes might be different for different "raw" formats; there's no agreed-upon world standard. Different environments (graphics cards, cameras, ...) do it differently for whatever reason, you simply have to know the layout.

    Reading out a pixel can then be done by this function:

    typedef unsigned char byte;
    void get_pixel(const byte *image, unsigned int w,
                   unsigned int x,
                   unsigned int y,
                   byte *red, byte *green, byte *blue)
    {
        /* Compute pointer to first (red) byte of the desired pixel. */
        const byte * pixel = image + w * y * 3 + 3 * x;
        /* Copy R, G and B to outputs. */
        *red = pixel[0];
        *green = pixel[1];
        *blue = pixel[2];
    }
    

    Notice how the height of the image is not needed for this to work, and how the function is free from bounds-checking. A production-quality function might be more armor-plated.

    Update If you're worried this approach will be too slow, you can of course just loop over the pixels, instead:

    unsigned int x, y;
    const byte *pixel = /* ... assumed to be pointing at the data as per above */
    
    for(y = 0; y < h; ++y)
    {
      for(x = 0; x < w; ++x, pixel += 3)
      {
        const byte red = pixel[0], green = pixel[1], blue = pixel[2];
    
        /* Do something with the current pixel. */
      }
    }
    

提交回复
热议问题