⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 例8-1.c

📁 C语言高级编程及实例剖析/王为青, 刘变红编著 ISBN号: 978-7-115-15423-1 出版发行项: 北京-人民邮电出版社 2007 光盘内容 附注项: 本书结合实
💻 C
字号:
/* Note:Your choice is C IDE */
#include <stdio.h>  
#include <dos.h>  
#include <process.h>
#include <bios.h>  

void selectpage(char page) /* 换页函数 */
{
	union REGS r;
	r.x.ax=0x4f05; 
	r.x.bx=0;  
	r.x.dx=page;  /* 选择页面 */
	int86(0x10,&r,&r);  
}   

unsigned char set_SVGA_mode(int Vmode)     /* 设置SVGA屏幕模式 */ 
{
	union REGS r;
	r.x.ax=0x4f02; 
	r.x.bx=Vmode;  
	int86(0x10,&r,&r);  
	return(r.h.ah);
}

unsigned int get_SVGA_mode()     /* 获取SVGA屏幕模式 */ 
{
	union REGS r;
	r.x.ax=0x4f03;  
	int86(0x10,&r,&r);  
	return(r.x.bx);
}

void main()
{  
	char buffer[640],page_new=0,page_old=0;
	int i,j,k,n,r,g,b,savemode;
	long position,width,length;
	FILE *fp;
	puts("This is a 256 color bmp viewer!");
	puts("Input filename:");  /* 输入要显示的BMP文件路径 */
	gets(buffer);
	if((fp=fopen(buffer,"rb"))==NULL)
	{
		printf("can't open file:%s",buffer);
		return;
	}
	fseek(fp,28,SEEK_SET);
	fread(&i,2,1,fp);
	if(i!=8)  /* 检查是否为256色位图 */  
	{
		puts("Not a 256 color bitmap!");
		fclose(fp);
		exit(0);
	}
	 
	fseek(fp,18,SEEK_SET);
	fread(&width,4,1,fp); 
	savemode=get_SVGA_mode();  /* 先保存原来的屏幕模式 */
	set_SVGA_mode(0x101);  /* 硬件无关性初始化屏幕为640×480 256色模式 */
	fseek(fp,54,SEEK_SET); 
	for(i=0;i<256;i++)    /* 按照该图片的DAC色表设置色彩寄存器 */
	{
		b=fgetc(fp);
		g=fgetc(fp);
		r=fgetc(fp);        /* 获取R、G、B分量 */
		outportb(968u,i);
		outportb(969u,r>>2);
		outportb(969u,g>>2);
		outportb(969u,b>>2); 
		fgetc(fp);
	}
	
	k=(width%4)?(4-width%4):0;      /* 宽度修正值 */ 
	for(j=length-1;j>=0;j--)
	{
		fread(buffer,width,1,fp);
		for(i=0,n=0;i<width;i++,n++)
		{
			position=j*640l+i;           /* 计算要显示点的显存位置 */
			page_new=position/65536l;    /* 计算显示页 */
			if(page_new!=page_old)        /* 当显示页不同时更换页面,提高一定的输出速度 */   
			{
				selectpage(page_new);
				page_old=page_new;
			}
			pokeb(0xa000,position%65536l,buffer[n]); /* 写到显存位置 */     
		}
		fseek(fp,k,SEEK_CUR);       /* 每行绘制完后修正宽度 */
	}
	fclose(fp);
	bioskey(0);
	set_SVGA_mode(savemode);                 /* 恢复屏幕 */            
}
		
	
	
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -