我要读一个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打开文件..

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top