1、资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。基于C语言的简单的图像演示和研究与实践 ( 江苏盐城技师学院 计算机系 224002) 摘要: 语言是近年来在国内外得到迅速推广应用的一种计算机语言。 介绍了C语言在在图像演示方面的优势及应用技术与举例关键字: C语言; 图像演示一、 引言C语言作为程序界广泛采用的语言, 诞生于70年代初, 在1975年UNIX第6版公布之后, C语言的突出有点得到了广泛关注, 并由美国电话电报公司(AT&T)贝尔实验室于一九七八年正式发表, 后由美国国家标准学会在此基础上制定了一个C 语言标准, 于一九八三年发表。一般称之为ANSI C。从此之后
2、 C语言语便以其言功能丰富, 表示能力强, 使用灵活方便, 应用面广, 目标程序效率高, 可移植性好, 既具有高级语言的优点, 又具有低级语言的许多特点( 很多的地方都被称为中级语言) , 被广泛的应用于计算机应用的各个领域。C语言已经从方方面面改变了我们的计算机世界, 加快了计算机应用的普及, 并诞生了很多经典的程序, 其中有著名的UNIX、 LINUX等很多代码都是基于C语言编写的, 而且它们以其效率高, 安全性高而成为网络服务器以及相关安全级别较高的领域的首选。二、 技术概述作为图像演示, 方法其实有很多种, 简单的说基本能够分为两大类, 一类是使用编程技术来实现( 比如使用C语言,
3、BASIC语言等) , 另一类则是使用图像演示辅助程序所提供的功能( 比如PPT,Flash等) 。那么在这之中我们为何会选择C语言来作为图像演示的实现方法呢? 我们来看一下如下的比较: 首先我们先来比较一下这两大类的区别, 作为图像演示, 图像演示辅助程序能够帮助我们快速的解决一些简单的图像演示, 可是图像演示所涉及的领域极其广泛, 而图像演示辅助程序却是给这种应用圈定了一个极其狭隘的范围, 而且其只能应用于一些相对比较简单的演示中, 如果当一些演示需要大量的变量计算和复杂的图形绘制的时候图像演示辅助软件就毫无用武之地了。而编程语言, 则能够不受限制的实现任何演示功能, 所有的计算机程序都是
4、有编程语言编写的, 因此只要是图像演示辅助软件能够实现的功能, 编程都能够实现, 而且编程能够实现及其复杂的演示应用, 甚至能够将多台电脑甚至是多台超级电脑联机进行联合运算以演示及其复杂的过程需要, 这是普通的演示辅助程序所无法做到的。其次我们再比较一下编程语言之间为什么我们选择C语言, C语言作为经典的编程语言, 经历了30多年的时光, 已经相当的成熟, 其代码能够几乎不用修改的直接在任何平台上编译使用, C语言的这种可移植行也是选它的原因之一。我们上面也提到过C语言是介于汇编和高级语言之间的, 因此C语言兼顾了高级语言和汇编语言, 使其在应用领域产生了很多1+12的效果。同时图像演示中的图
5、像绘制也是很耗费资源的, 用C语言编写图形和动画的比例非常高。比如在计算机游戏中( 也能够算是依据现实及想象相结合后的一种演示) 。在图像处理中常使用 C 语言图形函数库来进入图形模式和绘制各类图形 ,为了提高代码的效率 ,直接经过和硬件打交道来实现 ,所有图形绘制必须在图形模式下进行 ,BIOS视频服务中断 10H提供了初始化视频模式的方法 ,其功能号为 00H 即AH输入 ,经过调用中断函数 INT86 ( ) 来触发 BIOS视频中断 ,调用显示模式的函数 ,将屏幕设置为图形模式。因此综观各种因素之下, 我们能够发现在图像演示方面的优势。三、 利用C语言实现图像演示的实现方法图像演示大致
6、可分为两大块, 一为数据计算, 这个做为强大功能的C语言, 自然是很简单即可实现的, 另一块则为演示动画的显示层的制作, 接下来我们重点讲一下C语言制作演示动画的技术。C语言绘制动画的技术主要可分为四种。第一种为重画技术。所谓重画技术, 就是在屏幕上绘制出图像后将其擦除, 并重新画下的一个画面。重画技术又可分为直接重画、 双缓冲、 页替换和多缓冲。直接重画就是不断直接重画屏幕, 可分为全屏重画和局部重画, 全屏重画即整个屏幕绘制完成后停留到需要下一画面时将其清屏, 然后重新绘制整个屏幕, 可是作为演示动画, 往往里面并不是所有的图像都是一直改变的, 因此只对要动的区域进行重画, 这就是局部重画
7、因此在使用中我们很少使用全屏重画, 更多的使用的是局部重画。C语言图形函数库为我们提供了用于保存和重画屏幕区域的函数 getimage ( )和putimage ( ) ,提供了内存分配函数 malloc ( )或farmalloc ( )来申请内存空间。双缓冲技术则是在以上的基础上进行的一种发挥, 也就是将下一个页面所需的图像提前画好, 并保存, 当需要调用下一画面时直接有保存的图像替换屏幕中需要替换的内容, 并在后台进行下一画面的绘制。页替换和多缓冲也是在之前的基础上进行的扩展。第二种为异或技术。在逻辑运算中, 当A和B进行异或运算时, 如果A与B 是相同的 ,那么A与B 异或的结果是0
8、 ,如果A与B 是不同的 ,那么A与B 异或的结果是 1。我们在绘制图像时也能够使用这种技术。比如我们先画一条红线, 然后我们再在其上画一条这条红线的异或运算后的线, 这样, 这两条线就抵消了。第三种是调色板技术。在256色和16色模式下, 我们的计算机存在一块调色板, 其实它就是一个储存颜色信息的索引, 一些寄存器。而我们计算机屏幕的每个像素都是由红绿蓝(RGB) 三原色组成够成所有的颜色的。而所谓的调色板技术就是经过改变某些区域的像素的颜色, 来达到动画的效果。最后一种是拉屏技术。拉屏技术实际上是对双缓冲技术的改进, 就是将屏幕中显示的和为显示的构成一个打的缓存区域, 当图像需要移动是只需
9、要将屏幕移动, 然后在移动后的空白区域移入需显示的部分。大个比喻, 将一张地图平铺在你的显示屏上, 当然只有一部分会在屏幕的区域, 而其它部分已经超出了屏幕部分, 而当你想要屏幕上的地图的图像显示偏左一点的位置, 那么你只需要将地图往右拉动, 这样左边的为在屏幕上的部分就填充到了屏幕上。拉屏技术可分为横向拉屏、 纵向拉屏和全方向拉屏。接下来让我们来经过一个简单的例子, 来看看具体是如何制作演示程序的。演示程序制作大致能够分为四步: 第一步, 构思演示程序所要产生的界面。在这一步中, 大家需要考虑的是图像的一些外在因素, 也即是总体分析。像我们这里这个演示程序就比较简单, 就是首先是需要一个五角
10、星, 然后置于屏幕中间, 然后在周围产生闪闪的光芒。第二步是对图像的拆分及细化了, 就是那些图像具体该干什么, 怎么实现。以本例来说, 五角星的绘制我们能够根据五角星的十个转折点以及一个中心来画出五角星的轮廓, 然后对其进行颜色的填充, 使其呈现立体感。而闪闪发光的效果我们能够经过画出不断变化的中心点为圆心的放射线, 而放射线的两个端点有都同在两个同心圆的端点上。第三步, 对要实现的图像进行数据计算方面的考虑, 也就是绘制图像的方法。本例中的五角星的中心点的坐标只要获取屏幕的最大宽度和高度并除以2即可, 另外十个点是平均分布在以中心点为圆心的两个同心圆上, 我们能够使用正弦和余弦来计算她们的位
11、置。闪闪发光的放射线我们同样能够经过正弦和余弦来计算。最后一步则是进入到了实际的C语言程序的编写中去了, 这一步需要有耐心和细心。图像绘制过程中往往会有很多的点, 存储这些点所使用的变量不能混淆, 不然的话会产生不可预料的图像, 而同时, 编程时往往会出现一定的差错, 因此也需要耐心的查找并一一排除。下面我们来看一下本例在C语言中的实现。/*/* TurboC 3.0 下运行经过 */* 红星闪闪的图像演示 */*/#include#include#include#include#include#include#define RED 4#define LIGHTRED 12float rad=
12、3.1415926/180.0;float k=640/480;void star(float,float,float);void shine(int R,int r,int data)int x036,y036;int x136,y136;int i,data0=0;int X=getmaxx()/2,Y=getmaxy()/2; /* 确定屏幕中心坐标(X,Y) */* 闪烁效果的主要代码 */for(i=0;i18;i+)/* 计算放射线上的两个端点 */x0i=X+r*sin(data0+data)*rad);y0i=Y+k*r*cos(data0+data)*rad);x1i=X+R
13、sin(data0+data)*rad);y1i=Y+k*R*cos(data0+data)*rad);/* 反射线端点计算结束 */data+=20;setcolor(random(255); /* 设置随机颜色值 */delay(20);line(x0i,y0i,x1i,y1i); /* 经过计算出的两点画出一条放射线 */* 闪烁代码结束 */void main() /* 主函数, 有本函数开始执行 */float x,y,Radius;int Driver=DETECT,Mode;int step=0;initgraph(&Driver,&Mode,c:TC3);/* 以上为初始化图
14、像模式 */setbkcolor(1);/* 设置背景颜色 */x=getmaxx()/2;y=getmaxy()/2; /* 确定屏幕中心坐标(X,Y) */Radius=getmaxy()/5; /* 五角星的大小由同心圆的大圆决定, 这里大圆的半径取值为屏幕纵坐标的1/5 */star(x,y,Radius); /* 调用五角星绘制函数进行五角星的绘制 */while(!kbhit() /* 未接受都键盘按键时不停的执行一下循环 */* 计算并绘制反射线,并经过循环来重复覆盖原放射线, 以达到闪烁效果 */Radius=getmaxy()/4;step=20+random(40);shi
15、ne(Radius,Radius+step,0);delay(100);step+=20;Radius+=20;shine(Radius,Radius+step,0);delay(100);step+=20;Radius+=20;shine(Radius,Radius+step,0);delay(200);exit(0);void star(float x0,float y0,float R) /* 绘制五角星 */int x5,y5,x15,y15;float r;int i,a=18;/* 计算两个同心圆的十个点的坐标 */for (i=0;i5;i+)xi=x0+R*cos(a*rad)
16、k;yi=y0-R*sin(a*rad);a+=72;r=R*(sin(18*rad)/sin(54*rad);a=54;for(i=0;i5;i+)x1i=x0+r*cos(a*rad)*k;y1i=y0-r*sin(a*rad);a+=72;/* 经过所得点坐标进行五角星的绘制 */setcolor(RED);line(x0,y0,x0,y0);line(x0,y0,x14,y14);line(x0,y0,x14,y14);setfillstyle(SOLID_FILL,RED);floodfill(x14,y14-1,RED);setcolor(RED);line(x0,y0,x2,y
17、2);line(x0,y0,x12,y12);line(x2,y2,x12,y12);setfillstyle(SOLID_FILL,RED);floodfill(x12,y12-1,RED);setcolor(LIGHTRED);line(x0,y0,x10,y10);line(x0,y0,x10,y10);line(x0,y0,x0,y0);setfillstyle(SOLID_FILL,LIGHTRED);floodfill(x10,y0+1,LIGHTRED);setcolor(RED);line(x0,y0,x10,y10);line(x0,y0,x1,y1);line(x10,y1
18、0,x1,y1);setfillstyle(SOLID_FILL,RED);floodfill(x10-1,y10,RED);setcolor(LIGHTRED);line(x1,y1,x11,y11);line(x11,y11,x2,y2);line(x0,y0,x1,y1);line(x0,y0,x2,y2);setcolor(LIGHTRED);line(x0,y0,x12,y12);line(x0,y0,x3,y3);line(x12,y12,x3,y3);setfillstyle(SOLID_FILL,LIGHTRED);floodfill(x12+1,y12+1,LIGHTRED)
19、floodfill(x11+1,y11+1,LIGHTRED);setcolor(RED);line(x0,y0,x3,y3);line(x0,y0,x4,y4);line(x3,y3,x13,y13);line(x13,y13,x4,y4);setfillstyle(SOLID_FILL,RED);floodfill(x13,y13-1,RED);setcolor(LIGHTRED);line(x0,y0,x4,y4);line(x0,y0,x14,y14);line(x4,y4,x14,y14);setfillstyle(SOLID_FILL,LIGHTRED);floodfill(x1
20、4-1,y14+1,LIGHTRED);从以上程序中, 我们应注意到编程时候的模块化, 将不同的部分放在不同的函数里, 然后在主函数中调用, 这样不但能过使程序容易看懂, 结构井井有条, 而且当程序出错以及演示需要调整时能过快速定位, 并能最快的进行修改。而且大家不难看出, 本程序所进行演示时没有用到任何的图像, 全部是由函数计算绘制, 仅仅只用了线条和填充效果即可完成程序的演示图像的绘制, 程序及其的简单明了。四、 结束语在现在科技高速发展的世界中, 越来越多的创造被创造, 越来越多的理论被证实而这些创造及理论等都是需要演示, 需要验证的, 而图像演示正在这其中发挥着越来越重要的作用, 神州飞船的发射成功, 嫦娥奔月计划的顺利实施都是在这不计其数的模拟演示后一次成功的, 而这些复杂而高精度的计算, 正是高效率的C语言所能完成的, 因此我相信C语言在图像演示领域将会得到更广阔的应用。