我有uint8_t的R,G和B数组

uint8_t * R, * G, * B, * A;
int stride_r, stride_g, stride_b, stride_a;
getRGB(img, &R, &G, &B, &A, &stride_r, &stride_g, &stride_b, &stride_a);
// All the strides are equal and the img is img_width and img_height dimension
int RBG[stride_r * img_height];
所以我的问题是以下工作:
for(int i=0; i<stride_r * img_height; ++i)
{
    RGB[i] = R[i] << 24 + G[i] << 16 + B[i] << 8 + A[i];
}

最佳答案

您走在正确的轨道上。但是,您无需将四个组成部分的字节添加到四字节的整数中,而是需要使用bitwise or操作将它们组合起来:

for(int i = 0; i < stride_r * img_height; ++i)
{
    RGB[i] = (R[i] << 24) | (G[i] << 16) | (B[i] << 8) | A[i];
}
另外,请记住,在许多平台上,这些组件实际上是以“反向”顺序存储的(十六进制格式为0xaaBBGGRR);因此,如果您的系统上是这种情况,那么您将需要:
for(int i = 0; i < stride_r * img_height; ++i)
{
    RGB[i] = (A[i] << 24) | (B[i] << 16) | (G[i] << 8) | R[i];
}
此外,如评论中所述,您应该使用RGB类型将uint32_t真正设置为无符号整数的数组,最好是固定的32位大小。

关于c++ - 将R,G,B阵列转换为RGB阵列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63683922/

10-10 10:52