ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:22.54KB ,
资源ID:4690250      下载积分:1 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-4690250.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C语言大作业图形图像处理参考资料.docx)为本站会员(b****4)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

C语言大作业图形图像处理参考资料.docx

1、C语言大作业图形图像处理参考资料C语言大型作业参考资料图形操作简介1. 必要的头文件#include #include #include #include #include 2. 必须的系统变量int GraphDriver; int GraphMode; double AspectRatio; int MaxX, MaxY; int MaxColors; int ErrorCode;struct palettetype palette; 3. 初始化图形界面初始化出错处理关闭图形界面GraphDriver = DETECT; initgraph( &GraphDriver, &GraphMo

2、de, );initgraph( &GraphDriver, &GraphMode, ”d:tc );ErrorCode = graphresult(); if( ErrorCode != grOk )printf( Graphics System Error: %sn, grapherrormsg( ErrorCode ) );exit( 1 );closegraph(); /* Return the system to text mode */4. 取得必须的信息getpalette( &palette ); MaxColors = getmaxcolor() + 1; MaxX = ge

3、tmaxx();MaxY = getmaxy();AspectRatio = (double)xasp / (double)yasp;5. 一些常用的画图函数outtext( buffer ),outtextxy(x,y,buffer)line(x0,y0,x1,y1);linerel();lineto()circle(int x, int y, int radius); arc()bar(int l, int t, int r, int b);bar3d();moveto(int x, int y);moverel(dx,dy);getx()putpixel(x,y,color); getp

4、ixel(x,y)setcolor();setbkcolor();getcolor();getbkcolorouttext( buffer ),outtextxy(x,y,buffer)line(x0,y0,x1,y1);linerel();lineto()circle(int x, int y, int radius); arc()bar(int l, int t, int r, int b);bar3d();moveto(int x, int y);moverel(dx,dy);getx()putpixel(x,y,color); getpixel(x,y)setcolor();setbk

5、color();getcolor();getbkcolor();具体可以参见D:TCBGIDEMO.C例程,或看联机帮助,或参见下面的部分论文显示器是个人计算机的重要组成部分。随着计算机硬件的发展,现在有不同的显示器及其适配器用在个人计算机系统中。常用的显示器有CGA,Herclus,EGA,VGA,SVGA,TVGA等等。显示模式有两种,文本模式和图象模式,DOS操作系统中默认的是文本模式。在图形模式中,整个屏幕按显示器的分辨率分成点阵,EGA可以是643*350或640*200的点阵,CGA可以是640*200或320*200的点阵,VGA则可以640*200*16色,或640*480*1

6、6色,本程序中用的就是后一种(VGAHI)。 因为图形显示器种类很多,控制方式各异,要显示图形,必须先装入相应的图形驱动程序。其次每一种图形显示器,又具有不同的图形显示模式。要显示图形前必须决定选用哪一种显示模式,这些就是图形系统的初始化工作。4反之,在退出应用程序时,要恢复原来的文本模式,要退出图形系统。 图形系统初始化程序如下:Boolean InitG(void) int errorcode; errorcode = registerbgidriver(EGAVGA_driver); /* report any registration errors */ if (errorcode 0

7、) coutanGraphics error: grapherrormsg(errorcode); return false; int gd=DETECT,gm; initgraph(&gd,&gm,); errorcode=graphresult(); if(errorcode!=grOk) cerraendlgrapherrormsg(errorcode)endl; return false; return true;其中registerbgidriver(EGAVGA_driver)函数用于告诉连接程序,在连接时,把EGAVGA的驱动程序装入执行程序中。Initgraph( int *g

8、d,int *gm, char*)函数用于图形系统的初始化。Gd,gm分别表示图形驱动器和图形模式。Gd=DETECT,告诉初始化函数自动探测显示器的类型。Graphresult(),和grapherrormsg(int errorcode)用于检测图形系统初始化是否正确,若不正确则打印错误原因。本程序中的输出全部是在图形模式下,用到了画点(putpixle(int x,int y,int color)),画线(line(int x1,int y1,int x2,int y2),lineto(int x,int y)),坐标移动及提取(moveto(int x,int y), getx(),

9、gety(), getmaxx(), getmaxy())设置颜色(setcolor(int color),setbkcolor(int color), getcolor(), getmaxcolor())画框、设置点线的样式等等。图形系统的退出用closegraph()函数实现。鼠标操作简介1 鼠标简介鼠标系统实际上由两个主要元素组成:鼠标机制和称作鼠标驱动程序的内存驻留程序。鼠标驱动程序提供与鼠标通信所需的全部低级支持。此外,它自动维持鼠标光标位置和发现是否按下了某个键。一旦装入驱动程序,鼠标就可以被随后执行的任意程序使用。2 鼠标驱动程序的主要功能可以通过PC中断33H访问鼠标和鼠标驱动

10、程序的各种功能。所选择的特定函数依赖于中断时AX寄存器的值。三个其它寄存器(BX、CX和DX)用于把各种参数传送给鼠标例程。同样,鼠标函数使用这四个寄存器把鼠标的位置和按钮的状态返回给调用函数。功能输入值输出值功能调用初始化无AX BXAX=0000显示光标无无AX=0001隐藏光标无无AX=0002读取状态无BXCXDXAX=0003设置位置CX、DX无AX=0004设置光标BXCXDX无AX=0009X范围CX DX无AX=0007Y范围CX DX无AX=0008光标范围CX DX SI DI无AX=0010中断程序CX ES:DX无AX=000C3 鼠标功能调用方法用TC通过INT33H

11、中断来编制基本函数,有三种常用方法:嵌入汇编程序,如:ASM CLI清中断利用全程变量赋予寄存器值,然后通过函数geninterrupt()调用中断实现利用联合类型REGS,SREGS通过函数int86(),int86x()调用中断,原型在在dos.h注意一下例程中预定义了如下全局变量:#define true 1#define false 0int visual=false; /* to tell whether the mouse icon is visual and init as false*/4 鼠标的初始化InitMouse() union REGS regs;regs.x.ax=

12、0;int86(0x33,®s,®s);if(regs.x.ax=0)return false;else return true;5 鼠标光标的显示与隐藏HideCur() union REGS regs;if(visual)regs.x.ax=2;int86(0x33,®s,®s);visual=false;ShowCur() union REGS regs;if(!visual) regs.x.ax=1;int86(0x33,®s,®s);visual=true;在鼠标驱动程序中,鼠标的显示状态用0值表示,隐藏用负值表示,每调用一次显示功能则该值加一,每

13、调用一次隐藏功能,则该值减一。这样,在多次调用了驱动程序的隐藏鼠标光标功能后,再调用显示鼠标光标功能时,将不能正常显示鼠标光标。需要加入了一个visual布尔型变量,来取代驱动程序中的数值。6 读取按钮状态,读取或设置光标位置Status(int*x,int*y,int*status) union REGS regs;regs.x.ax=3;int86(0x33,®s,®s);*x=regs.x.cx;*y=regs.x.dx;*status=regs.x.bx;其中X,Y为光标位置status&1左键状态,1为按下,0为未按status&2右键状态,1为按下,0为未按status

14、&4中键状态,1为按下,0为未按要注意循环检测时的抖动现象,可增加一些空循环或延时来清除剩余的按键信号。例如:下面程序段,当鼠标移动时画线到当前的鼠标位置,当按左键时定义画线的启始位置,按右键时结束作图。int working=true;int x,y,status;while(working) Status(&x,&y,&status); If(status&1)/*left button pressed*/ moveto(x,y);/* move to current mouse position*/ Else if(status&2) /*right button pressed,qui

15、t*/ Working=false; Else/*no button pressed*/ Lineto(x,y);/*draw a line from last position */ Delay(20);/*delay 20ms to clear the dithering*/7 移动鼠标光标void MoveMouse(int x,int y) REGS regs;regs.x.ax=4;regs.x.cx=x;regs.x.dx=y;int86(0x33,®s,®s);8 设置鼠标的光标形状设置鼠标光标需要三个方面信息:鼠标的外边界:8*8点阵,16个整数鼠标的内部形状:8*

16、8点阵,16个整数以及鼠标的热点的相对坐标:int x,y其中外边界和内边界连续存放,为长度为32的整型数组 int marks32 SetCurs(unsigned masks32,x,y) union REGS regs; struct SREGS sregs;regs.x.ax=9;regs.x.bx=x; regs.x.cx=y;/* hot spot*/regs.x.dx=(unsigned)masks;segread(&sregs); int86(0x33,®s,®s);一些不同形状的光标数据:/mouse 0xffff, 0xffff, 0xffff, 0xffff,

17、 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, /Cursor mask 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x13c0, 0x3ff0, 0x7ff8, 0xfff8, 0xfff8, 0x0824, 0x0822, 0x1ce2, 0x0000, /empty hand 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x

18、ffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0c00, 0x1200, 0x1200, 0x1200, 0x13fe, 0x1249, 0x1249, 0x1249, 0x7249, 0x9001, 0x9001, 0x9001, 0x8001, 0x8001, 0x4002, 0x3ffc, /full arrow 0x3fff, 0x1fff, 0x0fff, 0x07ff, 0x03ff, 0x01ff, 0x00ff, 0x007f, 0x003f, 0x00ff, 0x

19、01ff, 0x10ff, 0x30ff, 0xf87f, 0xf87f, 0xfc3f, 0x0000, 0x4000, 0x6000, 0x7000, 0x7800, 0x7c00, 0x7e00, 0x7f00, 0x7f80, 0x7e00, 0x7c00, 0x4600, 0x0600, 0x0300, 0x0300, 0x0180, /full hand 0xf3ff, 0xe1ff, 0xe1ff, 0xe1ff, 0xe001, 0xe000, 0xe000, 0xe000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8

20、001, 0xc003, 0x0c00, 0x1200, 0x1200, 0x1200, 0x13fe, 0x1249, 0x1249, 0x1249, 0x7249, 0x9001, 0x9001, 0x9001, 0x8001, 0x8001, 0x4002, 0x3ffc ; Point hotspot=0,11,4,0,0,0,4,0;/*热点*/9 设置鼠标光标的移动范围SetMouseArea(int x0,int y0,int x1,int y1) union REGS regs;regs.x.ax=7;regs.x.cx=x0;regs.x.dx=x1;int86(0x33,&

21、regs;®s);regs.x.ax=8;regs.x.cx=y0;regs.x.dx=y1;int86(0x33,®s,®s);西文状态下汉字的显示1 汉字库简介程序中直接使用UCDOS中的HZK16,ASC16和HZK24三个文件。HZK16中存储的是16*16点阵汉字是按行存储的以便于显示,每个汉字字模32BYTE,按照国标码顺序存储,其中也包含了682个纯中文符号字母。ASC16存储256个西文ASCII码的8*16点阵格式,按行存储,每个ASCII码16字节。HZK24X存储24*24点阵打印字模,按列存储,每个汉字字模占576字节。24*24点阵汉字存储两比较大,

22、所以从16区1位啊字开始存储,以减少字库大小。其中X为KS表示楷体,宋体等。2 取得字节的某一位int getbit(unsigned char byte,int bit) if(bit7)return 0;return (bytebit)&0x1;函数getbit用于得出一个字节中每个位(bit)是0还是1。3 显示24点阵和16点阵汉字void PutChn24(x,y,char *by,color) int i1,i2,i3;for(i1=0;i124;i1+) /LINESfor(i2=0;i23;i2+) /3 bytes per linefor(i3=0;i38;i3+)if(ge

23、tbit(byi1*3+i2,7-i3)putpixel(x+i1,y+(i2*8+i3),color); void PutChn16(x,y,char* buf,color) int i1,i2,i3;for(i1=0;i116;i1+)for(i2=0;i22;i2+)for(i3=0;i38;i3+)if(getbit(bufi1*2+i2,7-i3) putpixel(x+i2*8+i3,y+i1,color); qu=c1-0xa1; wei=c2-0xa1;4 在字库中取字模通过计算个计算出该区位码在汉字库中的偏移量:lenth=32 long offset=(qu)*94+wei

24、)*(long)lenth;24*24点阵汉字字模的读取类似,只是其偏移量计算稍有不同:lenth=72long offset=(qu-15)*94+wei)*(long)lenth;5 参考部分论文其中的字模的或取如下,三个函数是类FileStream中的成员函数:const unsigned char *FileStream:GetBigFnt(const Chinese&c) if(buffer) delete buffer; buffer=NULL; lenth=72; buffer=new unsigned charlenth; if(!buffer) cerraNot enough

25、 memory error!endl; return buffer=NULL; int qu=c.c.c1-0xa1; int wei=c.c.c2-0xa1; long offset=(qu-15)*94+wei)*(long)lenth; bigfnt.clear(); bigfnt.seekg(offset,ios:beg); bigfnt.read(buffer,lenth); int count=bigfnt.gcount(); cout.setf(ios:dec); /coutendlgcount=countendl; if(count!=lenth) cerrnaCharacte

26、r not match in fnbigfnt font lib error!endl; bigfnt.clear(); lenth=0; deletebuffer; return buffer=NULL; return buffer;const unsigned char *FileStream:GetSmallFnt(const Chinese&c) if(buffer) delete buffer; buffer=NULL; lenth=32; buffer=new unsigned charlenth; if(!buffer) cerraNot enough memory error!

27、endl; return buffer=NULL; int qu=c.c.c1-0xa1; int wei=c.c.c2-0xa1; long offset=(qu)*94+wei)*(long)lenth; smallfnt.clear(); /clear last times error state smallfnt.seekg(offset,ios:beg);/locate smallfnt.read(buffer,lenth); /read to buffer int count=smallfnt.gcount(); /coutendldecgcount=countendl; if(c

28、ount!=lenth) cerrnaCharacter not match in fnsmallfnt font lib error!endl; smallfnt.clear(); /clear last times error state lenth=0; delete buffer; return buffer=NULL; return buffer;几个函数中用了较多的语句进行“文件流”fstream的操作,和内存的动态申请释放及存取,也用了较多的命令来容错。函数GetSmallFnt(c)的功能是从文件HZK16中取出32字节的汉字c的字模。汉字Chinese c是一个共用体,其中包

29、含两个字节,及该汉字的内码。每个字节减去0XA0后变成区位码。及: int qu=c.c.c1-0xa1; int wei=c.c.c2-0xa1;通过计算个计算出该区位码在汉字库中的偏移量: long offset=(qu)*94+wei)*(long)lenth;然后通过文件定位和文件读取可得到该字模代码。24*24点阵汉字字模的读取类似,只是其偏移量计算稍有不同 long offset=(qu-15)*94+wei)*(long)lenth;下面两个函数用于在屏幕上一个位置开始,以一个颜色显示16*16点阵和24*24点阵的汉字字符串。其中用到了上面的PutChn16和PutChn24两个函数。由于一个汉字的存储需要两个字节,所以在一个字符串中处理汉字,在遇到一个字符时,首先要判断该字符是常规的ASCII字符(首位为“0”)还是用于汉字的字符(首位为“1”),其次如果首位为“1”,还要判断该字符是该汉字的第一个字符(flag=0),还是第二个字符(flag=1),再将表示一个汉字的两个字符组合成一个汉字并显示。如果遇到空格还要空出一个字符的位置。如果遇到常规ASCII字符还要用PutAsc16显示(本程序暂时未考虑AS

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2