2012-11-16 270 views
-3

我怎么能转换BGRA缓冲区,缓冲区RGBA格式C++如何将BGRA缓冲区转换为RGBA缓冲区格式?

void ConvertBetweenBGRAandRGBA(unsigned char* input, int pixel_width,int pixel_hight, 
          unsigned char* output) { 

     for (int y = 0; y < pixel_hight; y++) { 
     for (int x = 0; x < pixel_width; x++) { 
     const unsigned char* pixel_in = &input[y * x * 4]; 

     unsigned char* pixel_out = &output[y * x * 4]; 
     pixel_out[0] = pixel_in[2]; 
     pixel_out[1] = pixel_in[1]; 
     pixel_out[2] = pixel_in[0]; 
     pixel_out[3] = pixel_in[3]; 
    } 
} 

,但我没有得到背景颜色。

请帮助我吗?

+0

如果你没有获得背景颜色,那你到底在做什么?给你一个例子的价值和你获得的价值。你有没有证实你的循环是做你想做的? –

回答

0

这不是C#,所以请重新标记。

假设这是位图数据,首先,您需要计算图像的步幅。步幅是每行像素使用的字节数。这并不总是等于bytes_per_pixel * pixels_per_row。它通常对齐到四个字节,所以在这种情况下(因为ARGB像素使用每个像素四个字节),你应该没问题。其次,你得到像素(x,y)地址的公式是错误的。像素以行优先顺序存储。这意味着,从像素缓冲区中的偏移量0开始,您将看到一行完整的像素数据;然后是另一个完整的行;等等。每行像素数据都有一个完整的字节步长。

可以做到这一点:

const unsigned char* pixel_in = &input[((y * pixel_width) + x) * 4]; 

但是,如果你的步伐确实等于图像宽度,你不需要每次都计算出地址,因为像素将按顺序存储:

void ConvertBetweenBGRAandRGBA(unsigned char* input, int pixel_width, 
    int pixel_height, unsigned char* output) 
{ 
    int offset = 0; 

    for (int y = 0; y < pixel_height; y++) { 
     for (int x = 0; x < pixel_width; x++) { 
      output[offset] = input[offset + 2]; 
      output[offset + 1] = input[offset + 1]; 
      output[offset + 2] = input[offset]; 
      output[offset + 3] = input[offset + 3]; 

      offset += 4; 
     } 
    } 
} 

如果它仍然没有显示正确,然后确认正确的像素打包是什么。它应该是ARGB或BGRA;我从来没有听说过RGBA像素。

相关问题