将24bit RGB转换为ARGB16

时间:2009-10-12 09:09:12

标签: c rgb argb byte-shifting

我必须阅读24bpp Bitmap并将每个像素从RGB24转换为ARGB16

我使用了以下代码,

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

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

任何帮助都将受到高度赞赏。

6 个答案:

答案 0 :(得分:2)

分手。让我们继续使用宏:

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

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

这假设alpha只是一位。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

在我看来,你可能想要从r,g和b中掩盖你不需要的位。也许是这样的:

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

编辑:哎呀,我认为Michael Buddingh的回答可能是对的 - 你会想要转移,这会让你获得最重要的一点。

答案 3 :(得分:0)

我要么使用位掩码来摆脱你不需要的位:( colorvalue&amp; 0x1F)。

将颜色值移到右边3位(似乎是更好的选项)。

并且是&lt;&lt; 15你真的需要什么?您将依赖于0位为0或1的事实来将alpha位设置为开或关。因此,如果您的alpha值为0xFE,那么alpha位将为0,而如果它为0x01,则为1。

答案 4 :(得分:0)

你可能想要SCALE而不是TRUNCATE。

以R组件为例,24位RGB中的0xDE(222)将成为16位RGB中的0x1A = (222.0/0xFF)*0x1F

答案 5 :(得分: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)&lt;&lt; 15) |(r>&gt; 3)|((g&gt;&gt; 3)&lt;&lt; 5)|((b&gt;&gt; 3)&lt;&lt; 10)) ),但输出文件显示我:1F 1F 1F当我用hexaeditor而不是7C00打开文件时..