将R8G8B8A8图像复制到R8G8B8

Copying R8G8B8A8 image to R8G8B8

本文关键字:R8G8B8 复制 图像 R8G8B8A8      更新时间:2023-10-16

我正在尝试将R8G8B8A8映像转换为R8G8B8映像,我现在得到的是一个图像,但是有了很多扫描行,我每个像素是4个字节,是4个字节,32位。

图像缓冲区是类型的无符号char [width*height*4],这是源,目的地是无签名的char [width*height*3]。

    int j = 0;
    int i = 0;
    for (int k = 0; k < (width*height); k++)
    {
        for(int b = 0; b < 3; b++)
        {
            dst[i + b] = src[j + b];
        }
        i+=3;
        j+=4;
    }

可能的目标图像需要在4个字节边界上对齐的行:

for(unsigned int y(0); y != height; ++y)
{
    unsigned int sourceStart(y * width * 4);
    unsigned int destStart(y * ((width * 3 + 3) & 0xfffffffc) ); // align on 4 bytes
    for(unsigned int x(0); x != width; ++x)
    {
        for(unsigned int color(0); color != 3; ++color)
        {
            dst[destStart++] = src[sourceStart++];
        }
        ++sourceStart; // account for 4th byte in source
    }
}

您可以做到这一点:

for (int k = 0; k < width*height; k++)
{
    for(int b = 0; b < 3; b++)
    {
        dst[k*3 + b] = src[k*4 + b];
    }
}