DOS真彩色模式下真彩色图像显示技术.docx
- 文档编号:8739472
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:12
- 大小:21.16KB
DOS真彩色模式下真彩色图像显示技术.docx
《DOS真彩色模式下真彩色图像显示技术.docx》由会员分享,可在线阅读,更多相关《DOS真彩色模式下真彩色图像显示技术.docx(12页珍藏版)》请在冰豆网上搜索。
DOS真彩色模式下真彩色图像显示技术
DOS真彩色模式下真彩色图像显示技术
来源:
博彩通.lc
摘要该文通过介绍CirrusGD5434卡等几种高、真彩色卡及其显示模式,详述了DOS环境下与硬件无关的VESA高彩色仿真真彩色、真彩色图像全息显示的一般性方法,还提示了24位PCX真彩色图像解压缩快速显示编程的要点。
最后给出C语言编程示例。
一、高、真彩色显示卡
近年来,顺应CAD、CG及多媒体技术进步的要求,许多彩色适配器板卡厂商先后推出性能价格比较高的一系列高彩色(HighColor)和真彩色(TrueColor)SuperVGA显示卡。
如TridentMicrosystems公司的TGUI94XX、TGUI96XX,CirrusLogic的GD543X、GD544X,TsengLaboratories的ET4000,ARKLogic的ARK1000,、ARK2000,S3Incorporated的S386CXXX等等。
它们除了继续支持标准VGA模式外,都支持16色、256色、32K高彩色、64K高彩色及16.7M真彩色VESABIOS扩展模式,版本大多为VESA1.2,卡上具有32K、64K及16.7MDAC,有16位ISA、32位VESA、32位PCI总线等多种接口,显示VRAM配置一般有1M、2M、4M,一般都带有硬件加速的32位或64位图形加速引擎(GraphicsEngine),满足了当今386~586各种档次的PC机对更多色彩、更高分辨率的要求。
表1整理了市场上常见的GD5434(64位GUI)、TGUI9440AGi(32位GUI)和ARK2000PV(64位GUI)三种PCI总线高、真彩色显示卡的OEMBIOS调用模式号、色彩数、分辨率、VESA模式对照及其相应的VRAM占用等数据。
其他支持VESA1.2的显示卡只要查阅卡附手册得到OEM(原始设备制造商)自定义的高、真彩色模式号或其对应的VESA模式号。
有些配4MVRAM的显示卡甚至可支持1280×102416M色(VESA1.211BH模式)。
表1二、高、真彩色编程与256色编程的异同
高、真彩色模式编程在写视频缓冲区端口索引号、页切换方式、置模式号等方面类同扩展256色编程,例如,Trident的高、真彩色显示卡,写视频缓冲区端口索引号仍是(0x3C4,0xE)和(0x3C5,page^2),视频窗口页粒度仍是64,页切换方式仍是64K页、128K页任选。
不同点在于:
高、真彩色模式已经不再使用256组DAC寄存器索引号及调色板概念,而使用像素字长的RGB分量数据直接描述色彩及饱和度,写视频缓冲区映射到VRAM后由新的64KDAC或16MDAC将色彩数据转为模拟信号送多频彩色显示器,256色编程中有关调色板的BIOS中断全部失去作用;其次,由于用多个字节表示一个像素,高、真彩色DAC转换的时间成倍增加,显示速度过分依赖卡上图形引擎(GraphicsEngine)的效率,再加上数据成倍占用RAM或VRAM,所以显示速度明显慢于256色图像显示。
另外,不同厂商自定义的访问端口寄存器索引号的方式均各不相同,直接根据硬件特性的编程必然缺乏通用性。
若按照这些显示适配卡都支持的VESA(VideoElectronicsStandardsAssociation)标准扩展BIOS功能调用接口编程,从而实现软件接口层次上的兼容性,所编程序便可在众多的SuperVGA卡上运行,有关VESA编程的详细资料请查阅有关书刊。
表2是高、真彩色像素的分量结构示意,是理解高、真彩色图像编程的关键。
表2三、24位PCX图像格式简介
24位PCX图像的文件头同16色、256色的一样,共128字节,其中每个像素所用的彩色位数(bit-perpixel)值为8,彩色平面数(color-planes)值为3,不再使用调色板。
24位PCX图像数据的存储仍采用有限行程压缩法,但却是把单个的RGB行作为三个位平面数据分别进行压缩存放,第一个位平面由该行所有红色像素组成;第二个位平面由该行所有绿色像素组成;第三个位平面由该行所有蓝色像素组成,因为行程编码方法并不是总能减小24位复杂图像的大小,所以对24位PCX文件进行解码得到的结果图像比原来的小也属正常。
本文所用24位PCX文件格式符合PCPaintbrushVersion5标准,是从PhotoStyler1.0的TIF图例转换的。
将上述解压缩的数据用于显示时,需按显示卡硬件高、真彩色DAC送色彩信号的顺序--红绿蓝红绿蓝......--重新组织,才能正确地显示24位真彩色图像。
这一点是最不同于其他用三字节行程编码的24位RGB真彩色图像(如24位TGA)。
其它格式24位的真彩色图像文件只是图像头处理及解压数据的方式不同,显示的原理则完全相同。
文后所附例程作适当改变,就可用于24位TIF、24位BMP、24位TGA等图像文件的显示。
下面就640X480分辨率介绍32K、64K高彩色、16M真彩色模式显示24位PCX图像。
四、32K、64K高彩色仿真16M真彩色编程
现成的64K色图像很少,彩色扫描仪扫出的多为256色或24位真彩色,许多图像处理软件包的图例也是同样情形。
这里只好用24位真彩色图像经下述图示过程的位移合并,做成16位的64K高彩色像素字。
这种取24位RGB分量高位的方法仿真显示真彩色图像,明亮部分的色彩层次能较好还原,低暗部分的色彩层次有微小损失,仿真效果很好。
读者也可根据需要作其他位的取舍(如舍两头留中间),以使色彩还原最小失真。
图
图示中的空格为零。
32K高彩色仿真与此类似,只需将绿色分量也右移3位,与红色、蓝色分量一道做成最高位为零,低15位有效的一个字,送视频缓冲区便可。
具体编程要点如下:
1.调用VESABIOS4f02H号功能置高彩色图形模式,成功后调用VESABIOS4f01H号功能返回每线字节数Line-bytes及窗口页粒度Wingran等重要参数;2.读图像头后直接读图像数据,按上述方法转换为一16位字后送视频缓冲区始址A000:
0000,每一像素一个字,每送一个字到视频缓冲区,地址偏移量加2;3.640×480分辨率下每根扫描线需1280字节,为提高显示速度,由Line-bytes预先算出每根扫描线始址存于addr数组备查,由于满屏需600K字节,故编程上仍需考虑切换VRAM页的情况。
例程根据各种卡不同模式的窗口页粒度Wingran值,调用VESABIOS4f05H号功能访问硬件分页寄存器实现64K页模式切换(此时仍有一根扫描线跨两页的情形);4.显示完毕,调用VESABIOS4f02H号功能置模式03H恢复原文本模式。
五、16M真彩色编程
真彩色编程的关键是要了解图像数据的存放顺序及解压方法,其次注意读图像数据后按顺序要求作转换,否则图像色彩失真。
其余过程同高彩色模式。
具体编程要点如下:
1.调用VESABIOS4F02H号中断置真彩色图形模式;成功后调用VESABIOS4F01H号功能,返回每线字节数Line-bytes及窗口页粒度Wingran等重要参数;2.读图像文件头后直接读图像数据,解压缩后按红绿蓝顺序送视频缓冲区始址A000:
0000,每一像素三字节,每送一像素到视频缓冲区,地址偏移量加3;3.在VESA112H模式(640×48016.7MColor)下,不同显示适配卡的每线字节数是不一样的,如ARK2000PV为1920,GD5434及TGUI9440为2048,S386C868为2560,但由于使用VESA编程,4F01H号功能能准确返回每线字节Line-bytes值,并预先算出每条扫描线始址存于addr数组,可提高显示速度,由于满屏需900K以上字节,故编程上仍需考虑切换VRAM页的情况,换页机制同64K色情形;4.有些装2MVRAM的适配卡,可在640×48016.7M色情况下使用32位快速格式,如S386C868的112H模式及GD5434的76H模式,每线字节为2560,此时解压缩后按红绿蓝及一零字节顺序送视频缓冲区始址A000:
0000,每一像素4字节,每送一像素到视频缓冲区,地址偏移量加4,类似特殊情况,例程照此稍作修改便可;5.显示完毕,调用VESABIOS4F02H号功能置模式03H,恢复原文本模式。
六、示范程序
以上两种编程实现见所附例程,程序在有ISA/VESA/PCI三种总线插槽的OctekHippo12型主板、AMDDX4/100CPU、8MRAM、EMC1024×768、28隔行扫描彩色显示器、CirrusGD5434(2MVRAM)显示卡、BorlandC++3.1Small模式下编译通过。
但执行程序并不依赖所编译的硬件环境,曾经在装有1MVRAM的TGUI9440、TGUI9680、ARK2000PV、S386C868等VESA局部总线、PCI局部总线、甚至ISA总线的TVGA8900D(也支持VESA1.2标准,1M以下的OEM模式号同TGUI9440)显示卡的486~586各档PC机的DOS环境下均获通过。
示例程序对SuperVGA卡VESABIOS高、真彩色扩展模式编程具有一般性。
对本文未提到的其它高、真彩色显示卡,只要其支持VESA标准(Version>1.1),不加修改或稍作修改便可使用;对更高分辨率,只要显示适配卡配2MVRAM,便可作115H、116H、117H模式的编程,例程中只要修改highcolor()、truecolor()两函数中n、m的宽高界值和addr的上界。
但更重要的是:
程序运行以前用显示适配卡所配调整DRAM像素时钟或调整彩色显示器扫描频率的实用程序,将像素时钟和扫描频率调整到该卡现行分辨率所要求的值上,例如,CirrusGD5434卡(2MVRAM)要在117H模式下顺利仿真显示16.7M真彩色,须在DOS下先执行CLMODE.EXEt640=60t800=60t1024=60t1280=0,程序便可顺利显示高彩色图像。
//24位PCX高、真彩色图像显示例程
#include
#include
#include
#include
#include
#include
#include
#include
#include
unsignedlongdataoffset,Line-bytes;
unsignedlongaddr;
unsignedintCurpage,Wingran,Y-res,width,height;
FILE*fp;
typedefstruct{//PCX图像文件头格式
charmanufacturer;
charversion;
charencoding;
charbits-perpixel;
intxmin,ymin;
intxmax,ymax;
inthres;
intvres;
charpalette;
charreserved;
charcolor-planes;
intbytes-perline;
intpalettetype;
charfiller;
}PCXHEAD;
structmodeinfoblock{
unsignedintmodeattr;
unsignedcharwinaattr;
unsignedcharwinbattr;
unsignedintwingran;
unsignedintwinsize;
unsignedintwinaseg;
unsignedintwinbseg;
unsignedchar*pagefunc;
unsignedintbytesperscanline;
unsignedintxres,yres;
unsignedcharcharx,chary;
unsignedcharnumberofplanes;
unsignedcharbitperpixel;
unsignedcharnumberofbanks;
unsignedcharmemorymodel;
unsignedcharbanksize;
unsignedcharnumberofimagepages;
unsignedcharReserved;
unsignedcharx;
}modeinfo;
voidSetVesaMode(unsignedintmode);
voidVesaInfo(unsignedintmode);
voidmap(void);
voidSelectpage(unsignedintpage);
voidhighcolor(void);
voidtruecolor(void);
main()//主函数
{PCXHEADheader;
char*filename,c;
printf("Pleaseenterthe640X48024bitRGBmodePCXfil
ename:
");
gets(filename);
if((fp=fopen(filename,"rb"))==NULL)
{
SetVesaMode(0x03);
puts("Filereadingerror");
exit
(1);
}
fread((char*)&header,1,sizeof(PCXHEAD),fp);
width=header.bytes-perline;
height=header.ymax-header.ymin+1;
printf("Imageinformation:
Width=%d,Height=%d",width,h
eight);
if((header.bits-perpixel==8)&&(header.color-planes==3)
){
printf("
Type:
24bitsRGBtruecolors");
printf("1...Emulatingdisplay16Mtruecolorimagewith
64Khighcolor");
printf("2...Displayof16Mtruecolorimage");
printf("Pressselect1or2:
");
if((c=getch())==#39;1#39;){
highcolor();
SetVesaMode(0x03);
}
elseif(c==#39;2#39;){
truecolor();
SetVesaMode(0x03);
}
else{
printf("Thisisnothigh-color&true-colorimage!
")
;
exit
(1);
}
}
fclose(fp);
return0;
}
//设置VESABIOS扩展模式函数
voidSetVesaMode(unsignedintmode)
{unionREGSr;
unsignedintsetmode=1;
r.x.ax=0x4f02;
r.x.bx=mode;
int86(0x10,&r,&r);
if(r.x.ax!
=0x4f)
setmode=0;
elseVesaInfo(mode);
Curpage=0xffff;
return(setmode);
}
//返回VESA编程信息函数
voidVesaInfo(unsignedintmode)
{unionREGSr;
structSREGSsr;
r.x.cx=mode;
r.x.ax=0x4f01;
sr.es=FP-SEG(&modeinfo);
r.x.di=FP-OFF(&modeinfo);
int86x(0x10,&r,&r,&sr);
Wingran=modeinfo.wingran;
Line-bytes=modeinfo.bytesperscanline;
Y-res
=modeinfo.yres;
}
//计算扫描线始址函数
voidmap(void)
{registerinti,j;
for(i=0;i addr=(unsignedlong)(i)*Line-bytes; } //选择视频窗口对准页函数 voidSelectpage(unsignedintpage) {unionREGSr; if(page! =Curpage){ r.x.bx=0; r.x.dx=page*64L/Wingran; r.x.ax=0x4f05; int86(0x10,&r,&r); Curpage=page; } } //16位高彩色仿真24位PCX真彩色图像显示函数 voidhighcolor(void) {registerinti,j; unsignedintred,green,blue; unsignedint*word,*wordptr; intn,m,k,cnt,total; unsignedlongsegmet; unsignedchar*pic,*p0,*p1,*p2; unsignedcharpage,picdata; SetVesaMode(0x111); map(); Selectpage(0); n=min(480,height); m=min(640,width); word=(unsignedint*)malloc(2*m); wordptr=word; for(k=0;k<3;k++) pic=(unsignedchar*)malloc(m); p0=pic;p1=pic;p2=pic; fseek(fp,0x80L,SEEK-SET); for(i=0;i pic=p0;pic=p1;pic=p2; word=wordptr; for(j=0;j<3;j++){ total=0; while(total cnt=1; picdata=fgetc(fp); if(0xc0==(0xc0&picdata)){ cnt=0x3f&picdata; picdata=fgetc(fp); for(k=0;k *pic++=picdata; } else *pic++=picdata; total+=cnt; } } pic=p0;pic=p1;pic=p2; for(j=0;j red=*pic++>>3; green=*pic++>>2; blue=*pic++>>3; red=red<<11;green=green<<5; *word++=red|green|blue; } word=wordptr; for(j=0;j<2*(m-1);j+=2){ segmet=addr+j; page=segmet>>16; if(segmet<=65535L){ poke(0xa000,addr+j,*word++); } else{ Selectpage(page); poke(0xa000,addr+j,*word++); } } } getch(); free(wordptr);free(pic); free(pic);free(pic); } //24位PCX真彩色图像全息显示函数 voidtruecolor(void) {registerinti,j; unsignedchar*pic,*p0,*p1,*p2; unsignedcharpage,picdata; intn,m,k,cnt,total; unsignedlongsegmet; SetVesaMode(0x112); map(); Selectpage(0); n=min(480,height); m=min(640,width); for(k=0;k<3;k++) pic=(unsignedchar*)malloc(m); p0=pic;p1=pic;p2=pic; fseek(fp,0x80L,SEEK-SET); for(i=0;i pic=p0;pic=p1;pic=p2; for(j=0;j<3;j++){ total=0; while(total cnt=1; picdata=fgetc(fp); if(0xc0==(0xc0&picdata)){ cnt=0x3f&picdata; picdata=fgetc(fp); for(k=0;k *pic++=picdata; } else *pic++=picdata; total+=cnt; } } pic=p0;pic=p1;pic=p2; for(j=0;j<3*(m-1);j+=3){ segmet=addr+j; page=segmet>>16; if(segmet<=65535L){ for(k=0;k<3;k++) pokeb(0xa000,addr+j+k,*pic++); } else{ Selectpage(page); for(k=0;k<3;k++) pokeb(0xa000,addr+j+k,*pic++); } } } getch(); for(k=0;k<3;k++)free(pic); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DOS 彩色 模式 图像 显示 技术