添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

如何将BGRA缓冲区转换为RGBA缓冲区格式?

0 人关注

如何在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];

但我没有得到背景颜色。

有谁能帮助我吗?

1 个评论
如果你没有得到背景颜色,那么你得到的到底是什么? 请举例说明你得到的输入值和输出值。 你有没有验证过你的for循环是否在做你想做的事情?
c++
video-streaming
rgba
sreenivas
sreenivas
发布于 2012-11-17
2 个回答
Jeff
Jeff
发布于 2021-04-06
0 人赞同

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

假设这是位图数据,首先,你需要弄清图像的 跨度 。stride是指每行像素使用的字节数。这并不总是等于 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。

kireita
kireita
发布于 2021-04-06
0 人赞同

杰夫的答案是可行的,但有一个小细节,你从来没有存储过第一个偏移。 只要添加一个临时值,它就会像我一样工作得很好。

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++) {
            auto temp = output[offset];
            output[offset] = input[offset + 2];
            output[offset + 1] = input[offset + 1];
            output[offset + 2] = temp;
            output[offset + 3] = input[offset + 3];