给定图像结构中的像素结构数组,我想切换整个图像的红色和蓝色值。我不太确定如何改变它们。它们存储在结构中,使得值为红色,然后是绿色,然后是蓝色。每种颜色都是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;
}
}
答案 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;