将24位位图转换为8位位图。
什么也不说,给出程序。至于Bitmap.h和Bitmap.c的程序,上篇文章有。
#include <stdio.h>
#include <stdlib.h>
#include "Bitmap.h"
int main(int argc, char *argv[])
{
Bitmap *bmp = (Bitmap*)malloc(sizeof(Bitmap));
DWORD i = 0, j = 0, n = 0;
BYTE r = 0, g = 0, b = 0;
double gg = 0.0;
BYTE *pixel = 0;
DWORD line_width = 0;
RGBQUAD pal[256];
if( argc != 3 )
{
printf("Usage: 24to8 <img_src> <img_dst>\n");
free(bmp);
return -1;
}
load_bitmap( argv[1], bmp );
if( ISEMPTY( bmp ) || !IS24BITS( bmp ) )
{
free_bitmap( bmp );
free( bmp );
return -1;
}
line_width = ( bmp->width * 8 + 31 ) / 32 * 4;
pixel = (BYTE*)malloc( bmp->height * line_width * sizeof(BYTE) );
if( !pixel )
{
free_bitmap( bmp );
free( bmp );
return -1;
}
for( i = 0; i < bmp->height; i++ )
{
for( j = 0, n = 0; j < bmp->width * 3; j += 3 )
{
r = GET_R( bmp, i, j );
g = GET_G( bmp, i, j );
b = GET_B( bmp, i, j );
gg = 0.299 * r + 0.587 * g + 0.114 * b;
gg = LIMTO0( gg ); gg = LIM255( gg );
*( pixel + line_width * i + n ) = (BYTE)gg;
n++;
}
}
bmp->line_width = line_width;
bmp->bit_count = 8;
free( bmp->ptr );
bmp->ptr = pixel;
bmp->pal_length = sizeof(RGBQUAD) * 256;
bmp->palette = (BYTE*)malloc( bmp->pal_length * sizeof(BYTE) );
for( i = 0; i < 256; i++ )
{
pal[i].rgbBlue = (BYTE)i;
pal[i].rgbGreen = (BYTE)i;
pal[i].rgbRed = (BYTE)i;
pal[i].rgbReserved = 0;
}
memcpy( bmp->palette, pal, bmp->pal_length );
save_bitmap( argv[2], bmp );
free_bitmap( bmp );
free( bmp );
free( pixel );
return 0;
}
(落鹤生) |