## 2008. december 31., szerda

### Convert 8 or 16 bit color images to 32 bit

Problem/Question/Abstract:

How do I convert a 8 bit color image or a 16 bit color image to 32 bits of color? In my case, I have files with 8bit or 16bit images which I read using scanline. So I have one or two bytes determining the pixel color. What I want to do is still read one or two bytes for each pixel, for either the 8bit or the 16bit, but convert it to 32 bits on display.

I think you mean 8 or 16 bit per pixel, not 8 or 16 per sample. You must divide the 8 bit and the 16 bit. 8 bit is a indexed image (palette image). The pixel value is an index in a color table (palette). You need a pointer to this color table and get the color from this table. 16 bit is an RGB image, the pixel directly contains the color data. Unfortunately, you must determine the pixel mask. On Win9x the data can be 5 bit blue, 6 bit green, 5 bit red or 5 bit blue, 5 bit green, 5 bit red (bit 15 is unused). On WinNT or later the data can be stored in other combinations, but this is unlikely.

From a own project to convert such pixel data:

function DIB555ToBGR(Value: DWord): DWord; assembler;
asm
{blue}
mov   ecx, eax
shl   eax, 3
mov   edx, eax
and   eax, \$0000F8
shr   ecx, 2
and   ecx, \$000007
or    eax, ecx
{green}
shl   edx, 3
mov   ecx, edx
and   edx, \$00F800
or    eax, edx
shr   edx, 5
and   edx, \$000700
or    eax, edx
{red}
shl   ecx, 3
and   ecx, \$F80000
or    eax, ecx
shr   ecx, 5
and   ecx, \$070000
or    eax, ecx
end;

function DIB565ToBGR(Value: DWord): DWord; assembler;
asm
{blue}
mov   ecx, eax
shl   eax, 3
mov   edx, eax
and   eax, \$0000F8
shr   ecx, 2
and   ecx, \$000007
or    eax, ecx
{green}
shl   edx, 2
mov   ecx, edx
and   edx, \$00FC00
or    eax, edx
shr   edx, 6
and   edx, \$000300
or    eax, edx
{red}
shl   ecx, 3
and   ecx, \$F80000
or    eax, ecx
shr   ecx, 5
and   ecx, \$070000
or    eax, ecx
end;

However, I think you should simple use TBitmap.PixelFormat:

PixelFormat := pf32Bit;

This sets the bitmap to 32 Bit.

On the other side, you can directly display the 8 or 16 bit bitmap, the WinAPI convert the bitmap to the correct format.