反转24位颜色

时间:2015-07-26 20:04:33

标签: c colors bit-shift

给定图像结构中的像素结构数组,我想切换整个图像的红色和蓝色值。我不太确定如何改变它们。它们存储在结构中,使得值为红色,然后是绿色,然后是蓝色。每种颜色都是8位,因此大小为24.到目前为止,这就是我所拥有的。

    for (int row = 0; i < image->height;row++) {
    for (int column = 0; column < image->width; column++) {
        image->pixels[column + row * image->width] = image->pixels[column + row * image->width].red & 0xFFFFFFFF;
        image->pixels[column + row * image->width] = (image->pixels[column + row * image->width].blue>>16) & 0xFFFFFFFF;
    }
}

2 个答案:

答案 0 :(得分:2)

假设pixels是一个长数组,i + j * i确实是正确的地址,这应该可以解决问题。使用&隔离字节并移动以将各部分组合成新的长整数。

您自己的代码中的问题是您将中间结果分配回像素。通过这样做,您可以更改它,从而影响第二步。如果将中间结果分配给单独的变量,则可以分多步执行。但我更愿意在一项任务中完成:

long pixel = i + j * image->width; // Pixel index

image->pixels[pixel] = 
   (image->pixels[pixel] & 0xFF) << 16 + // Red, shift to position of blue
   (image->pixels[pixel] & 0xFF00) + // Green, stay in place
   (image->pixels[pixel] & 0xFF0000) >> 16; // Blue, shift right to position of red.

答案 1 :(得分:1)

您尚未显示image数组的元素的类型,但如果它是包含.red.blue(并且可能是.green)字段的结构,你根本不需要任何位移;你可以只交换那些字段中的值。

uint8_t temp = image->pixels[i + j * i].red;
image->pixels[i + j * i].red = image->pixels[i + j * i].blue;
image->pixels[i + j * i].blue = temp;