void Set_BMP_Palette_Register(int index,RGB_BMP_ptr color)
{
outp(PALETTE_MASK,0XFF);
outp(PALETTE_REGISTER_WR,index); /*确定调色板序号*/
outp(PALETTE_DATA,color->red); /*设置该序号为红色*/
outp(PALETTE_DATA,color->green); /*设置该序号为绿色*/
outp(PALETTE_DATA,color->blue); /*设置该序号为兰色*/
}
调用调色板的代码:
for(i=0;i<256,i++)
Set_BMP_Palette_Register(i,(RGB_BMP_ptr) &bmp256->palette);
现在我们开始进行完整的读取
(1)申请内存空间
(2)检查头文件信息区
(3)读取调色板数据
(4)读取位图到内存
(5)显示图象
(6)内存释放
(1)申请内存:
由于320*200是64K,而C程序允许用户申请的内存空间也只有64K,为了防止一次申请不到,我们可以分几次申请。使用malloc()函数就可以。
(2)检查头文件信息区:
A:判断是不是bmp文件(若不是,则无法显示)
B:文件是否为压缩格式(若是,则无法处理)
C:文件是否为256色
以下给出读取头文件信息到内存的代码:
read(fp,&bmp256->file,sizeof(bitmapfile));
read(fp,&bmp256->info,sizeof(bitmapinfo));
以下是检测bmp文件格式的函数:
void Check_Bmp(bmp_picture_ptr bmp_ptr)
{
if(bmp_ptr->file.bfType!=0x4d42) /*检测是不是bmp文件*/
{
printf("Not a BMP file! ");
exit(1);
}
if(bmp_ptr->info.biCompression!=0) /*检测是不是压缩文件,1表示压缩,0表示没压缩*/
{
printf("Can not display a compressed bmp file! ");
exit(1);
}
if(bmp_ptr->info.biBitCount!=8) /*检测是不是256色*/
{
printf("Not a index 256color bmp file! ");
exit(1);
}
}
(3)和(4)前面有介绍,这儿省略。
(5)显示图象
假设bmp文件的调色板区已写入计算机调色板,bmp文件图象存储区也已写到内存,以下给出具体的显示到屏幕的函数
void BMP_Show_Buffer2(bmp_picture_ptr image)
{
memcpy((char far *)video_buffer,(char far *)image->buffer,(unsigned int)info->biWidth*info->biHight/2)
}
(6)释放内存
void BMP_Delete(bmp_picture_ptr image)
{
free(image->buffer);
}
好了,经过以上几步,基本上你的bmp文件就能在C中显示了。当然前提是你使用256色的图形驱动。也就是你的int gdrive=DETECT应该改为int gdrive=6;如果你仅仅显示16色的文件,就没有必要了。
责任编辑:小草