回复 2楼 TonyDeng
/*换页函数(BMP模块的工具函数)*/
void selectpage(register char page)
{
union REGS r;
r.x.ax=0x4f05;
r.x.bx=0;
r.x.dx=page; /*选择页面*/
int86(0x10,&r,&r);
}
/*设置SVGA屏幕模式(BMP模块的工具函数)*/
unsigned char set_SVGA_mode(int vmode)
{
union REGS r;
r.x.ax=0x4f02;
r.x.bx=vmode;
int86(0x10,&r,&r);
return(r.h.ah);
}
/*读取BMP图像的函数(二级函数,被main函数调用)*/
void readbmp(char *filename)
{
char buffer[640],page_new=0,page_old=0;
int i,j,k,n,r,green,b,savemode;
long position,width,length;
FILE *fp;
char path[MAXPATH];
getcwd(path, MAXPATH);
strcat(path,"\\wenjian\\");
strcat(path,filename);
fp=fopen(path,"rb");//rb的类型为const char * mode,机内定义的。是文件使用方式的标志之一:只读方式打开二进制文件。
if(fp==NULL)
{
printf("Can't open file: %s",fp);
return;
}
set_SVGA_mode(0x101);
/*自定义函数,用于将硬件无关性初始化屏幕为 640*480 256 色模式*/
fseek(fp,28,SEEK_SET);
/*fseek用来移动文件内部位置指针,三个参量为文件指针,位移量(将位置指针移到距离参考点28个字节的地方),计算位移量的参考起始点。SEEK_SET表示文件首,用0表示,1,2分别指从当前位置和末位*/
fread(&i,2,1,fp);
//&i为读入的数据所要存放的内存区域的指针,2为每项数据的长度,1为数据项的多少,fp为被读的区域的指针
if(i!=8)
/*检查是否为256色位图*/
{
puts("Not a 256 color bitmap!");
fclose(fp);
exit(0);
}
fseek(fp,18,SEEK_SET);
/*如果正确,则位置指针偏移18字节,指向BMP的某些状态量的存储地址*/
fread(&width,4,1,fp);
/*读入四个字节到width中*/
fread(&length,4,1,fp);
fseek(fp,54,SEEK_SET);
/*指向了真正需要的文件处*/
for(i=0;i<256;i++)
/*按照该图片的DAC色表设置色彩寄存器*/
{
b=fgetc(fp);
green=fgetc(fp);
r=fgetc(fp);
/*获取R、G、B分量*/
outportb(0x3c8,i);
outportb(0x3c9,r>>2);
/*右移是要转化为VGA的6位寄存器形式*/
outportb(0x3c9,green>>2);
outportb(0x3c9,b>>2);
fgetc(fp);
}
k=(width%4)?(4-width%4):0; /*宽度修正值*/
for(j=length-1;j>=0;j--)
{
fread(buffer,width,1,fp);
/*每次读一项width个字节的数据,从fp指向的区域读到buffer指向的区域*/
for(i=0,n=0;i<width;i++,n++)
{
position=j*640l+i;
/*计算要显示点的显存位置*/
page_new=position/65536; /*计算显示页,每页能显示65535个位置*/
if(page_new!=page_old)
/*当显示页不同时更换页面,提高一定的输出速度*/
{
selectpage(page_new);
/*自定义函数,把page_new选中,置为当前页*/
page_old=page_new;
/*方便下一次换页*/
}
pokeb(0xa000,position%65536,buffer[n]); /*写到显存位置*/
}
fseek(fp,k,SEEK_CUR); /*每行绘制完后修正宽度,SEEK_CUR表示以当前位置为参考,后移k个字节*/
}
fclose(fp);
}
帮忙看看这个还需要增加些什么