我必须读取 a24bpp Bitmap
并将每个像素从 转换RGB24
为ARGB16
。
我使用了以下代码,
#define ARGB16(a, r, g, b) ( ((a) << 15) | (r)|((g)<<5)|((b)<<10))
但我没有得到所需的输出。
任何帮助将不胜感激。
我必须读取 a24bpp Bitmap
并将每个像素从 转换RGB24
为ARGB16
。
我使用了以下代码,
#define ARGB16(a, r, g, b) ( ((a) << 15) | (r)|((g)<<5)|((b)<<10))
但我没有得到所需的输出。
任何帮助将不胜感激。
分开来。让我们继续使用宏:
#define TRUNCATE(x) ((x) >> 3)
#define ARGB16(a,r,g,b) ((a << 15) | (TRUNCATE(r) << 10) | (TRUNCATE(g) << 5) | TRUNCATE(b)))
这假设 alpha 只是一个位。
由于每个 RGB 值可能是 8 位,您仍然需要将它们截断为 5 位,这样它们就不会在 ARGB16 值中“重叠”。
截断它们的最简单方法可能是将它们向右位移三个位置。
在我看来,您可能想从 r、g 和 b 中屏蔽掉不需要的位。也许是这样的:
#define ARGB16(a, r, g, b) ( ((a) << 15) | (r>>3)|((g>>3)<<5)|((b>>3)<<10))
编辑:哎呀,我认为 Michael Buddingh 的答案可能是正确的——你会想要离开,这会让你得到最重要的位。
我要么使用位掩码来删除您不需要的位:(colorvalue & 0x1F)。
将颜色值向右移动 3 位(似乎是更好的选择)。
<< 15 真的是你需要的吗?您将依靠 0 位是 0 或 1 来设置 alpha 位打开或关闭这一事实。因此,如果您的 alpha 值为 0xFE,则 alpha 位将为 0,而如果为 0x01,则为 1。
您可能想要 SCALE 而不是 TRUNCAT。
以 R 分量为例,0xDE(222)
24bit RGB 会变成0x1A = (222.0/0xFF)*0x1F
16bit RGB。
我有下面的代码:
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 ..