我必须阅读24bpp Bitmap
并将每个像素从RGB24
转换为ARGB16
。
我使用了以下代码,
#define ARGB16(a, r, g, b) ( ((a) << 15) | (r)|((g)<<5)|((b)<<10))
但我没有得到所需的输出。
任何帮助都将受到高度赞赏。
答案 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打开文件时..