c语言如何在编程中自动换图片,请问c语言中bmp图片怎么显示

回复 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

{

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);

}

帮忙看看这个还需要增加些什么

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值