设为首页 加入收藏

TOP

DOS下显示8位256色BMP位图(二)
2014-11-23 23:39:53 来源: 作者: 【 】 浏览:36
Tags:DOS 显示 8位 256 BMP位图
int i,j,fp,n_bytes;

bmp_picture bmp256;

unsigned char line_buf[SCREEN_WIDTH];

unsigned char far *line_ptr;

if ((fp=open(bmp,O_RDONLY))==1)

{

printf("Can not open file:%s",bmp);

exit(1);

}

read(fp,&bmp256.file,sizeof(bitmapfile));

read(fp,&bmp256.info,sizeof(bitmapinfo));

Check_Bmp((bmp_picture_ptr)&bmp256);

/* lseek(fp,54,0); */

for (i=0;i<256;i++) //读取文件颜色表数据

{

read(fp,&bmp256.palette[i].blue,1);

read(fp,&bmp256.palette[i].green,1);

read(fp,&bmp256.palette[i].red,1);

read(fp,&bmp256.palette[i].reserved,1);

}

for (i=0;i<256;i++)

Set_BMP_Palette_Register(i,(RGB_BMP_ptr)&bmp256.palette[i]); //设置调色板寄存器……

for(i=SCREEN_HEIGHT-1;i>=0;i--) //显示位图

{

lseek(fp,-(long)(SCREEN_HEIGHT-i)*SCREEN_WIDTH,SEEK_END); //定位读取数据区

n_bytes=read(fp,line_buf,SCREEN_WIDTH); //读取数据区数据

line_ptr=video_buffer+(SCREEN_HEIGHT-i-1)*SCREEN_WIDTH;

for(j=0;j

line_ptr[j]=line_buf[j];

}

close(fp);

}

void Set_Video_Mode(int mode) //设置显示模式……

{

union REGS inregs,outregs;

inregs.h.ah=0;

inregs.h.al=(unsigned char)mode;

int86(0x10,&inregs,&outregs);

}

void main()

{

Set_Video_Mode(VGA256); //设置显示模式为320*200 256色

BMP_Load_Screen("256.bmp"); //载入要显示位图并显示

getch();

Set_Video_Mode(TEXT_MODE); //设置回文本模式

}

BMP格式详解

位图文件头的格式:

typedef struct{

int bfType; //bfType(2字节),这里恒定等于&H4D42,ASCII字符'BM'

long bfSize; //文件大小,以4字节为单位

int bfReserve1; //备用

int bfReserve2; //备用

long bfoffBits; //数据区在文件中的位置偏移量

}BITMAPFILEHEADER; //文件头结构体,14字节

typedef struct{

long bitSize; //位图信息头大小

long biWidth; //图象宽度,像素单位

long biHeight; //图象高度,像素单位

int biPlanes; //位平面树=1

int biBitCount; //单位像素的位数,表示bmp图片的颜色位数,即24位图、32位图

long biCompression; //图片的压缩属性,bmp图片是不压缩的,等于0

long biSizeImage; //表示bmp图片数据区的大小,当上一个属性biCompression等于0时,这里的值可以省略不填

long biXPlosPerMeter;//水平分辨率,可省略

long biYPlosPerMeter;//垂直分辨率,可省略

long biClrUsed; //表示使用了多少个颜色索引表,一般biBitCount属性小于16才会用到,等于0时表示有2^biBitCount个颜色索引表

long biClrImportant; //表示有多少个重要的颜色,等于0时表示所有颜色都很重要

}BITMAPINFOHEADER; //位图信息头,40字节

BMP文件详解

1、BITMAPFILEHEADER结构体

一个bmp文件以BITMAPFILEHEADER结构体开始.

第1个属性是bfType(2字节),这里恒定等于&H4D42。由于内存中的数据排列高位在左,低位在右,所以内存中从左往右看就显示成(42 4D),所以在UltraEdit中头两个 字节显示为(42 4D)就是这样形成的,以后的数据都是这个特点,不再作重复说明。

第2个属性是bfSize(4字节),表示整个bmp文件的大小,这里等于&H000004F8=1272字节。

第3个、第4个属性分别是bfReserved1、bfReserved2(各2字节),这里是2个保留属性,都为0,这里等于&H0000、&H0000。

第5个属性是bfOffBits(4字节),表示DIB数据区在bmp文件中的位置偏移量,这里等于&H00000076=118,表示数据区从文件开始往后数的118字节开始。

BITMAPFILEHEADER结构体这里就讲完了,大家会发现BITMAPFILEHEADER只占了bmp文件开始的14字节长度,但需要 特别说明的是在vb中定义一个BITMAPFILEHEADER结构体变量,其长度占了16个字节,原因就是第1个属性本来应该只分配2个字节,但实际被 分配了4个字节,多出来2个字节,所以如果想保存一张bmp图片,写入BITMAPFILEHEADER结构体时一定要注意这一点。

2、BITMAPINFO结构体部分。

接下来是BITMAPINFO结构体部分.

BITMAPINFO段由两部分组成:BITMAPINFOHEADER结构体和RGBQUAD结构体。

其中RGBQUAD结构体表示图片的颜色信息,有些时候可以省略,一般的24位图片和32位图片都不带RGBQUAD结构体,因为DIB数据区直接表 示的RGB值,一般4位图片和8位图片才带有RGBQUA

首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇可变参数宏__VA_ARGS__ 下一篇在对话框显示出来后立即执行一段..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: