1

我必须读取 a24bpp Bitmap并将每个像素从 转换RGB24ARGB16

我使用了以下代码,

#define ARGB16(a, r, g, b) ( ((a) << 15) | (r)|((g)<<5)|((b)<<10))

但我没有得到所需的输出。

任何帮助将不胜感激。

4

6 回答 6

3

分开来。让我们继续使用宏:

#define TRUNCATE(x)  ((x) >> 3)

#define ARGB16(a,r,g,b) ((a << 15) | (TRUNCATE(r) << 10) | (TRUNCATE(g) << 5) | TRUNCATE(b)))

这假设 alpha 只是一个位。

于 2009-10-12T09:21:26.137 回答
1

由于每个 RGB 值可能是 8 位,您仍然需要将它们截断为 5 位,这样它们就不会在 ARGB16 值中“重叠”。

截断它们的最简单方法可能是将它们向右位移三个位置。

于 2009-10-12T09:13:34.237 回答
0

在我看来,您可能想从 r、g 和 b 中屏蔽掉不需要的位。也许是这样的:

#define ARGB16(a, r, g, b) ( ((a) << 15) | (r>>3)|((g>>3)<<5)|((b>>3)<<10))

编辑:哎呀,我认为 Michael Buddingh 的答案可能是正确的——你会想要离开,这会让你得到最重要的位。

于 2009-10-12T09:16:29.377 回答
0

我要么使用位掩码来删除您不需要的位:(colorvalue & 0x1F)。

将颜色值向右移动 3 位(似乎是更好的选择)。

<< 15 真的是你需要的吗?您将依靠 0 位是 0 或 1 来设置 alpha 位打开或关闭这一事实。因此,如果您的 alpha 值为 0xFE,则 alpha 位将为 0,而如果为 0x01,则为 1。

于 2009-10-12T09:21:48.617 回答
0

您可能想要 SCALE 而不是 TRUNCAT。

以 R 分量为例,0xDE(222)24bit RGB 会变成0x1A = (222.0/0xFF)*0x1F16bit RGB。

于 2009-10-12T09:33:43.650 回答
0

我有下面的代码:

    FILE *inFile;
BmpHeader header;
BmpImageInfo info;
Rgb *palette;
int i = 0;

    inFile = fopen( "red.bmp", "rb" );

fread(&header, 1, sizeof(BmpHeader), inFile);
fread(&info, 1, sizeof(BmpImageInfo), inFile);

palette = (Rgb*)malloc(sizeof(Rgb) * info.numColors);

fread(palette, sizeof(Rgb), info.numColors, inFile);

unsigned char buffer[info.width*info.height];

FILE *outFile = fopen( "red.a", "wb" );
Rgb *pixel = (Rgb*) malloc( sizeof(Rgb) );

int read, j;

for( j=info.height; j>0; j-- ) 
{
    for( i=0; i<info.width; i++ ) 
    {
        fread(pixel, 1, sizeof(Rgb), inFile);
        buffer[i] = ARGB16(0, pixel->red, pixel->green, pixel->blue);
    }
}

    fwrite(buffer, 1, sizeof(buffer), outFile);

我正在阅读红色图像(255 0 0),并且我正在使用您上面定义的函数(#define ARGB16(a,r,g,b)(((a)<<15)|(r>> 3)|((g>>3)<<5)|((b>>3)<<10)) ),但输出文件向我显示:1F 1F 1F 当我用十六进制编辑器打开文件而不是7C00 ..

于 2009-10-12T12:48:58.873 回答