题
我要读一个24bpp 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位,则仍需要将它们截断以五个位,从而它们将在ARGB16值不是“重叠”。
要截断这些最简单的方法可能是由三个地方他们位位移到正确的。
在我看来就像你可能想屏蔽掉你不从R,G和B所需要的位。也许是这样的:
#define ARGB16(a, r, g, b) ( ((a) << 15) | (r>>3)|((g>>3)<<5)|((b>>3)<<10))
编辑:哎呦,我认为迈克尔Buddingh答案可能是正确的 - 你要推卸,这让你最显著位
我要么使用位掩码来摆脱你不需要的位:(colorvalue&0x1F的)
无论是颜色值向右移位3位(似乎是更好的选择)。
和是<< 15真的是你需要什么?您将依赖于一个事实,即0位为0或1,将阿尔法位开启或关闭。因此,如果您的α值是0xFE时则所述α位将0,而如果它是0×01那将是1。
您可能想刻度,而TRUNCAT。
以R分量,例如,在0xDE(222)
24bit的RGB将成为16位RGB 0x1A = (222.0/0xFF)*0x1F
。
我的代码波纹管:
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),并且我使用由您上述(#定义ARGB16(A,R,G中定义的功能,b)中(((A)<< 15)|( R >> 3)|((克>> 3)<< 5)|((b >> 3)<< 10)) ),但输出文件显示我:1F 1F 1F当我与hexaeditor代替7C00打开文件..
不隶属于 StackOverflow