c语言图像函数机器用法 c语言画函数图像例子

c语言 图形函数

图形函数 1. 图形模式的初始化

成都创新互联-专业网站定制、快速模板网站建设、高性价比宁夏网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式宁夏网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖宁夏地区。费用合理售后完善,十多年实体公司更值得信赖。

不同的显示器适配器有不同的图形分辨率。即是同一显示器适配器, 在不同

模式下也有不同分辨率。因此, 在屏幕作图之前, 必须根据显示器适配器种类将

显示器设置成为某种图形模式, 在未设置图形模式之前, 微机系统默认屏幕为文

本模式(80列, 25行字符模式), 此时所有图形函数均不能工作。设置屏幕为图形

模式, 可用下列图形初始化函数:

void far initgraph(int far *gdriver, int far *gmode, char *path);

其中gdriver和gmode分别表示图形驱动器和模式, path是指图形驱动程序所

在的目录路径。有关图形驱动器、图形模式的符号常数及对应的分辨率见表2。

图形驱动程序由Turbo C出版商提供, 文件扩展名为.BGI。根据不同的图形

适配器有不同的图形驱动程序。例如对于EGA、 VGA 图形适配器就调用驱动程序

EGAVGA.BGI。 例4. 使用图形初始化函数设置VGA高分辨率图形模式

#include graphics.h

int main()

{

int gdriver, gmode;

gdriver=VGA;

gmode=VGAHI;

initgraph(gdriver, gmode, "c:\\tc");

bar3d(100, 100, 300, 250, 50, 1); /*画一长方体*/

getch();

closegraph();

return 0;

}

有时编程者并不知道所用的图形显示器适配器种类, 或者需要将编写的程序

用于不同图形驱动器, Turbo C提供了一个自动检测显示器硬件的函数, 其调用

格式为:

void far detectgraph(int *gdriver, *gmode);

其中gdriver和gmode的意义与上面相同。

例5. 自动进行硬件测试后进行图形初始化

#include graphics.h

int main()

{

int gdriver, gmode;

detectgraph(gdriver, gmode); /*自动测试硬件*/

printf("the graphics driver is %d, mode is %d\n", gdriver,

gmode); /*输出测试结果*/

getch();

initgraph(gdriver, gmode, "c:\\tc");

/* 根据测试结果初始化图形*/

bar3d(10, 10, 130, 250, 20, 1);

getch();

closegraph();

return 0;

}

上例程序中先对图形显示器自动检测, 然后再用图形初始化函数进行初始化

设置, 但Turbo C提供了一种更简单的方法, 即用gdriver= DETECT 语句后再跟

initgraph()函数就行了。采用这种方法后, 上例可改为:

例6.

#include graphics.h

int main()

{

int gdriver=DETECT, gmode;

initgraph(gdriver, gmode, "c:\\tc");

bar3d(50, 50, 150, 30, 1);

getch();

closegraph();

return 0;

}

另外, Turbo C提供了退出图形状态的函数closegraph(), 其调用格式为:

void far closegraph(void);

调用该函数后可退出图形状态而进入文本方式(Turbo C 默认方式), 并释放

用于保存图形驱动程序和字体的系统内存。

2. 独立图形运行程序的建立

Turbo C对于用initgraph()函数直接进行的图形初始化程序, 在编译和链接

时并没有将相应的驱动程序(*.BGI)装入到执行程序, 当程序进行到intitgraph()

语句时, 再从该函数中第三个形式参数char *path中所规定的路径中去找相应的

驱动程序。若没有驱动程序, 则在C:\TC中去找, 如C:\TC中仍没有或TC不存在,

将会出现错误:

BGI Error: Graphics not initialized (use 'initgraph')

因此, 为了使用方便, 应该建立一个不需要驱动程序就能独立运行的可执行

图形程序,Turbo C中规定用下述步骤(这里以EGA、VGA显示器为例):

1. 在C:\TC子目录下输入命令:BGIOBJ EGAVGA

此命令将驱动程序EGAVGA.BGI转换成EGAVGA.OBJ的目标文件。

2. 在C:\TC子目录下输入命令:TLIB LIB\GRAPHICS.LIB+EGAVGA

此命令的意思是将EGAVGA.OBJ的目标模块装到GRAPHICS.LIB库文件中。

3. 在程序中initgraph()函数调用之前加上一句:

registerbgidriver(EGAVGA_driver):

该函数告诉连接程序在连接时把EGAVGA的驱动程序装入到用户的执行程序中。

经过上面处理,编译链接后的执行程序可在任何目录或其它兼容机上运行。

假设已作了前两个步骤,若再向例6中加 registerbgidriver()函数则变成:

例7:

#includestdio.h

#includegraphics.h

int main()

{

int gdriver=DETECT,gmode;

registerbgidriver(EGAVGA_driver): / *建立独立图形运行程序 */

initgraph( gdriver, gmode,"c:\\tc");

bar3d(50,50,250,150,20,1);

getch();

closegraph();

return 0;

}

上例编译链接后产生的执行程序可独立运行。

如不初始化成EGA或CGA分辨率, 而想初始化为CGA分辨率, 则只需要将上述

步骤中有EGAVGA的地方用CGA代替即可。

3.屏幕颜色的设置和清屏函数

对于图形模式的屏幕颜色设置, 同样分为背景色的设置和前景色的设置。在

Turbo C中分别用下面两个函数。

设置背景色: void far setbkcolor( int color);

设置作图色: void far setcolor(int color);

其中color 为图形方式下颜色的规定数值, 对EGA, VGA显示器适配器, 有关

颜色的符号常数及数值见下表所示。

表3 有关屏幕颜色的符号常数表

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

符号常数 数值 含义 符号常数 数值 含义

———————————————————————————————————

BLACK 0 黑色 DARKGRAY 8 深灰

BLUE 1 兰色 LIGHTBLUE 9 深兰

GREEN 2 绿色 LIGHTGREEN 10 淡绿

CYAN 3 青色 LIGHTCYAN 11 淡青

RED 4 红色 LIGHTRED 12 淡红

MAGENTA 5 洋红 LIGHTMAGENTA 13 淡洋红

BROWN 6 棕色 YELLOW 14 黄色

LIGHTGRAY 7 淡灰 WHITE 15 白色

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

对于CGA适配器, 背景色可以为表3中16种颜色的一种, 但前景色依赖于不同

的调色板。共有四种调色板, 每种调色板上有四种颜色可供选择。不同调色板所

对应的原色见表4。

表4 CGA调色板与颜色值表

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

调色板 颜色值

——————————— ——————————————————

符号常数 数值 0 1 2 3

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

C0 0 背景 绿 红 黄

C1 1 背景 青 洋红 白

C2 2 背景 淡绿 淡红 黄

C3 3 背景 淡青 淡洋红 白

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

清除图形屏幕内容使用清屏函数, 其调用格式如下:

voide far cleardevice(void);

另外, TURBO C也提供了几个获得现行颜色设置情况的函数。

int far getbkcolor(void); 返回现行背景颜色值。

int far getcolor(void); 返回现行作图颜色值。

int far getmaxcolor(void); 返回最高可用的颜色值。

4. 基本图形函数

基本图形函数包括画点, 线以及其它一些基本图形的函数。本节对这些函数

作一全面的介绍。

一、画点

1. 画点函数

void far putpixel(int x, int y, int color);

该函数表示有指定的象元画一个按color所确定颜色的点。对于颜色color的

值可从表3中获得而对x, y是指图形象元的坐标。

在图形模式下, 是按象元来定义坐标的。对VGA适配器, 它的最高分辨率为

640x480, 其中640为整个屏幕从左到右所有象元的个数, 480 为整个屏幕从上到

下所有象元的个数。屏幕的左上角坐标为(0, 0), 右下角坐标为(639, 479), 水

平方向从左到右为x轴正向, 垂直方向从上到下为y轴正向。TURBO C 的图形函数

都是相对于图形屏幕坐标, 即象元来说的。

关于点的另外一个函数是:

int far getpixel(int x, int y);

它获得当前点(x, y)的颜色值。

2. 有关坐标位置的函数

int far getmaxx(void);

返回x轴的最大值。

int far getmaxy(void);

返回y轴的最大值。

int far getx(void);

返回游标在x轴的位置。

void far gety(void);

返回游标有y轴的位置。

void far moveto(int x, int y);

移动游标到(x, y)点, 不是画点, 在移动过程中亦画点。

void far moverel(int dx, int dy);

移动游标从现行位置(x, y)移动到(x+dx, y+dy)的位置, 移动过程中不画点。

二、画线

1. 画线函数

TURBO C提供了一系列画线函数, 下面分别叙述:

void far line(int x0, int y0, int x1, int y1);

画一条从点(x0, y0)到(x1, y1)的直线。

void far lineto(int x, int y);

画一作从现行游标到点(x, y)的直线。

void far linerel(int dx, int dy);

画一条从现行游标(x, y)到按相对增量确定的点(x+dx, y+dy)的直线。

void far circle(int x, int y, int radius);

以(x, y)为圆心, radius为半径, 画一个圆。

void far arc(int x, int y, int stangle, int endangle, int radius);

以(x, y)为圆心, radius为半径, 从stangle开始到endangle结束(用度表示)

画一段圆弧线。在TURBO C中规定x轴正向为0度, 逆时针方向旋转一周, 依次为

90, 180, 270和360度(其它有关函数也按此规定, 不再重述)。

void ellipse(int x, int y, int stangle, int endangle, int xradius,

int yradius);

以(x, y)为中心, xradius, yradius为x轴和y轴半径, 从角stangle 开始到

endangle结束画一段椭圆线, 当stangle=0, endangle=360时, 画出一个完整的

椭圆。

void far rectangle(int x1, int y1, int x2, inty2);

以(x1, y1)为左上角, (x2, y2)为右下角画一个矩形框。

void far drawpoly(int numpoints, int far *polypoints);

画一个顶点数为numpoints, 各顶点坐标由polypoints 给出的多边形。

polypoints整型数组必须至少有2倍顶点数个无素。每一个顶点的坐标都定义为x,

y, 并且x在前。值得注意的是当画一个封闭的多边形时, numpoints 的值取实际

多边形的顶点数加一, 并且数组polypoints中第一个和最后一个点的坐标相同。

下面举一个用drawpoly()函数画箭头的例子。

例9:

#includestdlib.h

#includegraphics.h

int main()

{

int gdriver, gmode, i;

int arw[16]={200, 102, 300, 102, 300, 107, 330,

100, 300, 93, 300, 98, 200, 98, 200, 102};

gdriver=DETECT;

registerbgidriver(EGAVGA_driver);

initgraph(gdriver, gmode, "");

setbkcolor(BLUE);

cleardevice();

setcolor(12); /*设置作图颜色*/

drawpoly(8, arw); /*画一箭头*/

getch();

closegraph();

return 0;

}

2. 设定线型函数

在没有对线的特性进行设定之前, TURBO C用其默认值, 即一点宽的实线,

但TURBO C也提供了可以改变线型的函数。线型包括:宽度和形状。其中宽度只有

两种选择: 一点宽和三点宽。而线的形状则有五种。下面介绍有关线型的设置函

数。

void far setlinestyle(int linestyle, unsigned upattern, int

thickness);

该函数用来设置线的有关信息, 其中linestyle是线形状的规定, 见表5。

表5. 有关线的形状(linestyle)

━━━━━━━━━━━━━━━━━━━━━━━━━

符号常数 数值 含义

—————————————————————————

SOLID_LINE 0 实线

DOTTED_LINE 1 点线

CENTER_LINE 2 中心线

DASHED_LINE 3 点画线

USERBIT_LINE 4 用户定义线

━━━━━━━━━━━━━━━━━━━━━━━━━

thickness是线的宽度, 见表6。

表6. 有关线宽(thickness)

━━━━━━━━━━━━━━━━━━━━━━━━━

符号常数 数值 含义

—————————————————————————

NORM_WIDTH 1 一点宽

THIC_WIDTH 3 三点宽

━━━━━━━━━━━━━━━━━━━━━━━━━

对于upattern, 只有linestyle选USERBIT_LINE 时才有意义( 选其它线型,

uppattern取0即可)。此进uppattern的16位二进制数的每一位代表一个象元, 如

果那位为1, 则该象元打开, 否则该象元关闭。

void far getlinesettings(struct linesettingstype far *lineinfo);

该函数将有关线的信息存放到由lineinfo 指向的结构中, 表中

linesettingstype的结构如下:

struct linesettingstype{

int linestyle;

unsigned upattern;

int thickness;

}

例如下面两句程序可以读出当前线的特性

struct linesettingstype *info;

getlinesettings(info);

void far setwritemode(int mode);

该函数规定画线的方式。如果mode=0, 则表示画线时将所画位置的原来信息

覆盖了(这是TURBO C的默认方式)。如果mode=1, 则表示画线时用现在特性的线

与所画之处原有的线进行异或(XOR)操作, 实际上画出的线是原有线与现在规定

的线进行异或后的结果。因此, 当线的特性不变, 进行两次画线操作相当于没有

画线。

有关线型设定和画线函数的例子如下所示。

例10.

#includestdlib.h

#includegraphics.h

int main()

{

int gdriver, gmode, i;

gdriver=DETECT;

registerbgidriver(EGAVGA_driver);

initgraph(gdriver, gmode, "");

setbkcolor(BLUE);

cleardevice();

setcolor(GREEN);

circle(320, 240, 98);

setlinestyle(0, 0, 3); /*设置三点宽实线*/

setcolor(2);

rectangle(220, 140, 420, 340);

setcolor(WHITE);

setlinestyle(4, 0xaaaa, 1); /*设置一点宽用户定义线*/

line(220, 240, 420, 240);

line(320, 140, 320, 340);

getch();

closegraph();

return 0;

}

5. 封闭图形的填充

填充就是用规定的颜色和图模填满一个封闭图形。

一、先画轮廓再填充

TURBO C提供了一些先画出基本图形轮廓, 再按规定图模和颜色填充整个封

闭图形的函数。在没有改变填充方式时, TURBO C以默认方式填充。 下面介绍这

些函数。

void far bar(int x1, int y1, int x2, int y2);

确定一个以(x1, y1)为左上角, (x2, y2)为右下角的矩形窗口, 再按规定图

模和颜色填充。

说明: 此函数不画出边框, 所以填充色为边框。

void far bar3d(int x1, int y1, int x2, int y2, int depth, int

topflag);

当topflag为非0时, 画出一个三维的长方体。当topflag为0时, 三维图形不

封顶, 实际上很少这样使用。

说明: bar3d()函数中, 长方体第三维的方向不随任何参数而变, 即始终为

45度的方向。

void far pieslice(int x, int y, int stangle, int endangle, int

radius);

画一个以(x, y)为圆心, radius为半径, stangle为起始角度, endangle 为

终止角度的扇形, 再按规定方式填充。当stangle=0, endangle=360 时变成一个

实心圆, 并在圆内从圆点沿X轴正向画一条半径。

void far sector(int x, int y, int stanle, intendangle, int

xradius, int yradius);

画一个以(x, y)为圆心分别以xradius, yradius为x轴和y轴半径, stangle

为起始角, endangle为终止角的椭圆扇形, 再按规定方式填充。

二、设定填充方式

TURBO C有四个与填充方式有关的函数。下面分别介绍:

void far setfillstyle(int pattern, int color);

color的值是当前屏幕图形模式时颜色的有效值。pattern的值及与其等价的

符号常数 除USER_FILL(用户定义填充式样)以外, 其它填充式样均可由setfillstyle()

函数设置。当选用USER_FILL时, 该函数对填充图模和颜色不作任何改变。 之所

以定义USER_FILL主要因为在获得有关填充信息时用到此项。

void far setfillpattern(char * upattern,int color);

设置用户定义的填充图模的颜色以供对封闭图形填充。

其中upattern是一个指向8个字节的指针。这8个字节定义了8x8点阵的图形。

每个字节的8位二进制数表示水平8点, 8个字节表示8行, 然后以此为模型向个封

闭区域填充。

void far getfillpattern(char * upattern);

该函数将用户定义的填充图模存入upattern指针指向的内存区域。

void far getfillsetings(struct fillsettingstype far * fillinfo);

获得现行图模的颜色并将存入结构指针变量fillinfo中。其中fillsettingstype

结构定义如下:

struct fillsettingstype{

int pattern; /* 现行填充模式 * /

int color; /* 现行填充模式 * /

};

三、任意封闭图形的填充

截止目前为止, 我们只能对一些特定形状的封闭图形进行填充, 但还不能对

任意封闭图形进行填充。为此, TURBO C 提供了一个可对任意封闭图形填充的函

数, 其调用格式如下:

void far floodfill(int x, int y, int border);

其中: x, y为封闭图形内的任意一点。border为边界的颜色, 也就是封闭图

形轮廓的颜色。调用了该函数后, 将用规定的颜色和图模填满整个封闭图形。例12:

#includestdlib.h

#includegraphics.h

main()

{

int gdriver, gmode;

strct fillsettingstype save;

gdriver=DETECT;

initgraph(gdriver, gmode, "");

setbkcolor(BLUE);

cleardevice();

setcolor(LIGHTRED);

setlinestyle(0,0,3);

setfillstyle(1,14); /*设置填充方式*/

bar3d(100,200,400,350,200,1); /*画长方体并填充*/

floodfill(450,300,LIGHTRED); /*填充长方体另外两个面*/

floodfill(250,150, LIGHTRED);

rectanle(450,400,500,450); /*画一矩形*/

floodfill(470,420, LIGHTRED); /*填充矩形*/

getch();

closegraph();

}

6. 有关图形窗口和图形屏幕操作函数

一、图形窗口操作

象文本方式下可以设定屏幕窗口一样, 图形方式下也可以在屏幕上某一区域

设定窗口, 只是设定的为图形窗口而已, 其后的有关图形操作都将以这个窗口的

左上角(0,0)作为坐标原点, 而且可为通过设置使窗口之外的区域为不可接触。

这样, 所有的图形操作就被限定在窗口内进行。

void far setviewport(int xl,int yl,int x2, int y2,int clipflag);

设定一个以(xl,yl)象元点为左上角, (x2,y2)象元为右下角的图形窗口, 其

中x1,y1,x2,y2是相对于整个屏幕的坐标。若clipflag为非0, 则设定的图形以外

部分不可接触, 若clipflag为0, 则图形窗口以外可以接触。

void far clearviewport(void);

清除现行图形窗口的内容。

void far getviewsettings(struct viewporttype far * viewport);

获得关于现行窗口的信息,并将其存于viewporttype定义的结构变量viewport

中, 其中viewporttype的结构说明如下:

struct viewporttype{

int left, top, right, bottom;

int cliplag;

};

二、屏幕操作

除了清屏函数以外, 关于屏幕操作还有以下函数:

void far setactivepage(int pagenum);

void far setvisualpage(int pagenum);

这两个函数只用于EGA,VGA 以及HERCULES图形适配器。setctivepage() 函数

是为图形输出选择激活页。 所谓激活页是指后续图形的输出被写到函数选定的

pagenum页面, 该页面并不一定可见。setvisualpage()函数才使pagenum 所指定

的页面变成可见页。页面从0开始(Turbo C默认页)。如果先用setactivepage()

函数在不同页面上画出一幅幅图像,再用setvisualpage()函数交替显示, 就可以

实现一些动画的效果。

void far getimage(int xl,int yl, int x2,int y2, void far *mapbuf);

void far putimge(int x,int,y,void * mapbuf, int op);

unsined far imagesize(int xl,int yl,int x2,int y2);

这三个函数用于将屏幕上的图像复制到内存,然后再将内存中的图像送回到

屏幕上。首先通过函数imagesize()测试要保存左上角为(xl,yl), 右上角为(x2,

y2)的图形屏幕区域内的全部内容需多少个字节, 然后再给mapbuf 分配一个所测

数字节内存空间的指针。通过调用getimage()函数就可将该区域内的图像保存在

内存中, 需要时可用putimage()函数将该图像输出到左上角为点(x, y)的位置上,

其中getimage()函数中的参数op规定如何释放内存中图像。

对于imagesize()函数, 只能返回字节数小于64K字节的图像区域, 否则将会

出错, 出错时返回-1。

本节介绍的函数在图像动画处理、菜单设计技巧中非常有用。

例13: 下面程序模拟两个小球动态碰撞过程。

7. 图形模式下的文本输出

在图形模式下, 只能用标准输出函数, 如printf(), puts(), putchar() 函

数输出文本到屏幕。除此之外, 其它输出函数(如窗口输出函数)不能使用, 即是

可以输出的标准函数, 也只以前景色为白色, 按80列, 25行的文本方式输出。

Turbo C2.0也提供了一些专门用于在图形显示模式下的文本输出函数。下面

将分别进行介绍。

一、文本输出函数

void far outtext(char far *textstring);

该函数输出字符串指针textstring所指的文本在现行位置。

void far outtextxy(int x, int y, char far *textstring);

该函数输出字符串指针textstring所指的文本在规定的(x, y)位置。 其中x

和y为象元坐标。

说明:

这两个函数都是输出字符串, 但经常会遇到输出数值或其它类型的数据,

此时就必须使用格式化输出函数sprintf()。

sprintf()函数的调用格式为:

int sprintf(char *str, char *format, variable-list);

它与printf()函数不同之处是将按格式化规定的内容写入str 指向的字符串

中, 返回值等于写入的字符个数。

例如:

sprintf(s, "your TOEFL score is %d", mark);

这里s应是字符串指针或数组, mark为整型变量。

C语言中有没有绘图的函数库?里面每个函数的内容和用法是什么?

图形和图像函数包含在graphics.h里面

(一) 像素函数

56. putpiel() 画像素点函数

57. getpixel()返回像素色函数

(二) 直线和线型函数

58. line() 画线函数

59. lineto() 画线函数

60. linerel() 相对画线函数

61. setlinestyle() 设置线型函数

62. getlinesettings() 获取线型设置函数

63. setwritemode() 设置画线模式函数

(三)、多边形函数

64. rectangle() 画矩形函数

65. bar() 画条函数

66. bar3d() 画条块函数

67. drawpoly() 画多边形函数

(四)、 圆、弧和曲线函数

68. getaspectratio()获取纵横比函数

69. circle()画圆函数

70. arc() 画圆弧函数

71. ellipse()画椭圆弧函数

72. fillellipse() 画椭圆区函数

73. pieslice() 画扇区函数

74. sector() 画椭圆扇区函数

75. getarccoords()获取圆弧坐标函数

(五)、 填充函数

76. setfillstyle() 设置填充图样和颜色函数

77. setfillpattern() 设置用户图样函数

78. floodfill() 填充闭域函数

79. fillpoly() 填充多边形函数

80. getfillsettings() 获取填充设置函数

81. getfillpattern() 获取用户图样设置函数

(六)、图像函数

82. imagesize() 图像存储大小函数

83. getimage() 保存图像函数

84. putimage() 输出图像函数

四、图形和图像函数

对许多图形应用程序,直线和曲线是非常有用的。但对有些图形只能靠操作单个像素才能画出。当然如果没有画像素的功能,就无法操作直线和曲线的函数。而且通过大规模使用像素功能,整个图形就可以保存、写、擦除和与屏幕上的原有图形进行叠加。

(一) 像素函数

56. putpixel() 画像素点函数

功能: 函数putpixel() 在图形模式下屏幕上画一个像素点。

用法: 函数调用方式为void putpixel(int x,int y,int color);

说明: 参数x,y为像素点的坐标,color是该像素点的颜色,它可以是颜色符号名,也可以是整型色彩值。

此函数相应的头文件是graphics.h

返回值: 无

例: 在屏幕上(6,8)处画一个红色像素点:

putpixel(6,8,RED);

57. getpixel()返回像素色函数

功能: 函数getpixel()返回像素点颜色值。

用法: 该函数调用方式为int getpixel(int x,int y);

说明: 参数x,y为像素点坐标。

函数的返回值可以不反映实际彩色值,这取决于调色板的设置情况(参见setpalette()函数)。

这个函数相应的头文件为graphics.h

返回值: 返回一个像素点色彩值。

例: 把屏幕上(8,6)点的像素颜色值赋给变量color。

color=getpixel(8,6);

(二) 直线和线型函数

有三个画直线的函数,即line(),lineto(),linerel()。这些直线使用整型坐标,并相对于当前图形视口,但不一定受视口限制,如果视口裁剪标志clip为真,那么直线将受到视口边缘截断;如果clip为假,即使终点坐标或新的当前位置在图形视口或屏幕极限之外,直线截断到屏幕极限。

有两种线宽及几种线型可供选择,也可以自己定义线图样。下面分别介绍直线和线型函数。

58. line() 画线函数

功能: 函数line()使用当前绘图色、线型及线宽,在给定的两点间画一直线。

用法: 该函数调用方式为void line(int startx,int starty,int endx,int endy);

说明: 参数startx,starty为起点坐标,endx,endy为终点坐标,函数调用前后,图形状态下屏幕光标(一般不可见)当前位置不改变。

此函数相应的头文件为graphics.h

返回值: 无

例: 见函数60.linerel()中的实例。

59. lineto() 画线函数

功能: 函数lineto()使用当前绘图色、线型及线宽,从当前位置画一直线到指定位置。

用法: 此函数调用方式为void lineto(int x,int y);

说明: 参数x,y为指定点的坐标,函数调用后,当前位置改变到指定点(x,y)。

该函数对应的头文件为graphics.h

返回值: 无

例: 见函数60.linerel()中的实例。

60.linerel() 相对画线函数

功能: 函数linerel() 使用当前绘图色、线型及线宽,从当前位置开始,按指定的水平和垂直偏移距离画一直线。

用法: 这个函数调用方式为void linerel(int dx,int dy);

说明: 参数dx,dy分别是水平偏移距离和垂直偏移距离。

函数调用后,当前位置变为增加偏移距离后的位置,例如,原来的位置是(8,6),调用函数linerel(10,18)后,当前位置为(18,24)。

返回值:无

例: 下面的程序为画线函数调用实例:

#i ncludegraphics.h

void main()

{

int driver,mode;

driver=DETECT;

mode=0;

initgraph(driver,mode,"");

setcolor(15);

line(66,66,88,88);

lineto(100,100);

linerel(36,64);

getch();

restorecrtmode();

}

61. setlinestyle() 设置线型函数

功能: setlinestyle() 为画线函数设置当前线型,包括线型、线图样和线宽。

用法: setlinestyle() 函数调用方式为void setlinestyle(int stly,unsigned pattern,int width);

说明: 参数style为线型取值,也可以用相应名称表示,如表1-10中所示。

参数pattern用于自定义线图样,它是16位(bit)字,只有当style=USERBIT_LINE(值为1)时,pattern的值才有意义,使用用户自定义线图样,与图样中“1”位对应的像素显示,因此,pattern=0xFFFF,则画实线;pattern=0x9999,则画每隔两个像素交替显示的虚线,如果要画长虚线,那么pattern的值可为0xFF00和0xF00F,当style不为USERBIT_LINE值时,虽然pattern的值不起作用,但扔须为它提供一个值,一般取为0。

参数wigth用来设定线宽,其取值见表1-11,表中给出了两个值,即1和3,实际上,线宽取值为2也是可以接受的。

若用非法参数调用setlinestyle()函数,那么graphresult()会返回错误代码,并且当前线型继续有效。

Turbo C提供的线型与线宽定义在头文件graphics.h中,表1-10和1-11分别列出了参数的取值与含义。

表1-10 线型

-----------------------------------------------------

名 称 取 值 含 义

-----------------------------------------------------

SOLID_LINE 0 实线

DOTTED_LINE 1 点线

CNTER_LINE 2 中心线

DASHED_LINE 3 虚线

USERBIT_LINE 4 用户自定义线型

-----------------------------------------------------

表1-11 线宽

-----------------------------------------------------------

名 称 取 值 说 明

-----------------------------------------------------------

NORM_WIDTH(常宽) 1 一个像素宽(缺省值)

THICK_WIDTH(加宽) 3 三个像素宽

-----------------------------------------------------------

这个函数的头文件是graphics.h

返回值: 无

例: 下面的程序显示了BC中所提供的线型图样:

#i ncludegraphics.h

void main()

{

int driver,mode;

driver=DETECT;

mode=0;

initgraph(driver,mode,"");

for(i=0;i4;i++)

{

setlinestyle(i,0,1);

line(i*50,200,i*50+60,200)

}

getch();

restorecrtmode();

}

62. getlinesettings() 获取线型设置函数

功能: 函数getlinesettings() 用当前设置的线型、线图样和线宽填 写linesettingstype型结构。

用法: 函数调用方式为void getlinesettings(struct linesettingstype *info);

说明: 此函数调用执行后,当前的线型、线图样和线宽值被装入info指向的结构里,从而可从该结构中获得线型设置。

linesettingstype型结构定义如下:

struct linesettingstype {

int linestyle;

unsigned upattern;

int thickness;

};

其中linestyle用于存放线型,线型值为表1-10中的各值之一。

upattern用为装入用户自定义线图样,这是16位字,每一位等于一个像素,如果哪个位被设置,那么该像素打开,否则关闭。

thickness为线宽值存放的变量,可参见表1-11。

getlinesettings()函数对应的头文件为graphics.h

返回值: 返回的线型设置存放在info指向的结构中。

例: 把当前线型的设置写入info结构:

struct linesettingstype info;

getlinesettings(info);

63.setwritemode() 设置画线模式函数

功能: 函数setwritemode() 设置画线模式

用法: 函数调用方式为 void setwritemode()(int mode);

说明: 参数mode只有两个取值0和1,若mode为0,则新画的线将复盖屏幕上原有的图形,此为缺省画线输出模式。如果mode为1,那么新画的像素点与原有图形的像素点先进行异或(XOR)运算,然后输出到屏幕上,使用这种画线输出模式,第二次画同一图形时,将擦除该图形。调用setwritemode()设置的画线输出模式只影响函数line(),lineto(),linerel(),recangle()和drawpoly()。

setwritemode()函数对应的头文件是graphics.h

返回值: 无

例: 设置画线输出模式为0:

setwritemode(0);

(三)、多边形函数

对多边形,无疑可用画直线函数来画出它,但直接提供画多边形的函数会给用户很大方便。最常见的多边形有矩形、矩形块(或称条形)、多边形和多边形块,我们还把长方形条块也放到这里一起考虑,虽然它不是多边形,但它的特例就是矩形(块)。下面直接介绍画多边形的函数。

64. rectangle() 画矩形函数

功能: 函数rectangle() 用当前绘图色、线型及线宽,画一个给定左上角与右下角的矩形(正方形或长方形)。

用法: 此函数调用方式为void rectangle(int left,int top,int right,int bottom);

说明: 参数left,top是左上角点坐标,right,bottom是右下角点坐标。如果有一个以上角点不在当前图形视口内,且裁剪标志clip设置的是真(1),那么调用该函数后,只有在图形视口内的矩形部分才被画出。

这个函数对应的头文件为graphics.h

返回值: 无

例: 下面的程序画一些矩形实例:

#i ncludegraphics.h

void main()

{

int driver,mode;

driver=DETECT;

mode=0;

initgrpah(driver,mode,"");

rectangle(80,80,220,200);

rectangle(140,99,180,300);

rectangle(6,6,88,88);

rectangle(168,72,260,360);

getch();

restorecrtmode();

}

65. bar() 画条函数

功能: 函数bar()用当前填充图样和填充色(注意不是给图色)画出一个指定上左上角与右下角的实心长条形(长方块或正方块),但没有四条边线)。

用法: bar()函数调用方式为void bar(int left,int top,int right,int bottom);

说明: 参数left,topright,bottom分别为左上角坐标与右下角坐标,它们和调用函数rectangle()的情形相同,调用此函数前,可用setfillstyle()或setfillpattern()设置当前填充图样和填充色。

注意此函数只画没有边线的条形,如果要画有边线的的条形,可调用下面的函数bar3d()来画,并将深度参数设为0,同时topflag参数要设置为真,否则该条形无顶边线。

这 应的头文件为graphics.h

返回值: 无

例: 见函数bar3d()中的实例。

66.bar3d() 画条块函数

功能: 函数bar3d() 使用当前绘图色、线型及线宽画出三维长方形条块,并用当前填充图样和填 充色填充该三维条块的表面。

用法: 此函数调用方式为void bar3d(int left,int top,int right,int bottom,int depth,int topflag);

说明: 参数left,top,right,bottom分另为左上角与右下角坐标,这与bar()函数中的一样。参数depth为条块的深度,以像素为单位,通常按宽度的四分之一计算。深度方向通过屏显纵横比调节为约45度(即这时x/y比设置为1:1)。

参数topflag相当于一个布尔参数,如果设置为1(真)那么条块上放一顶面;若设置为0(假),则三维条形就没有顶面,这样可使多个三维条形叠加在一起。

要使图形更加美观,可利用函数floodfill()或setfillpattern()来选择填充图样和填充色(参见本小节(五)填充函数 )。

bar3d()函数对应的头文件为graphics.h

返回值: 无

例: 下面的程序画一个条形和条块:

#i ncludegraphics.h

void main()

{

int driver,mode;

driver=DETECT;

mode=0;

initgraph(driver,mode,"");

setfillstyle(SOLID-FILL,GREEN);

bar(60,80,220,160);

setfillstyle(SOLID-FILL,RED);

bar3d(260,180,360,240,20,1);

getch();

restorecrtmode();

}

67. drawpoly() 画多边形函数

功能: 函数drawpoly() 用当前绘图色、线型及线宽,画一个给定若干点所定义的多边形。

用法: 此函数调用方式为void drawpoly(int pnumber,int *points);

说明: 参数pnumber为多边形的顶点数;参数points指向整型数组,该数组中是多边形所有顶点(x,y)坐标值,即一系列整数对,x坐标值在前。显然整型数组的维数至少为顶点数的2倍,在定义了多边形所有顶点的数组polypoints时,顶点数目可通过计算sizeof(polypoints)除以2倍的sizeof(int)得到,这里除以2倍的原因是每个顶点有两个整数坐标值。另外有一点要注意,画一个n个顶点的闭合图形,顶点数必须等于n+1,并且最后一点(第n+1)点坐标必须等于第一点的坐标。

drawpoly()函数对应的头文件为grpahics.h

返回值: 无

例: 下面的程序画一个封闭星形图与一个不封闭星形图:

#i ncludegraphics.h

void main()

{

int driver,mode;

static int polypoints1[18]={100,100,110,120,100,130,120,125,140,140,130,120,

140,110,120,115,100,100};

static int polypoints2[18]={180,100,210,120,200,130,220,125,240,140,230,120,

240,110,220,115,220,110};

driver=DETECT;

mode=0;

initgraph(driver,mode,"");

drawpoly(9,polypoints1);

drawpoly(9,polypoints2);

getch();

restorecrtmode();

}

(四)、 圆、弧和曲线函数

在一个屏幕上画得很圆的图形到另一个屏幕上可能被压扁或拉长,这是因为每一种显示卡与之相应的显示模式都有一个纵横比。纵横比是指像素的水平方向大小与垂直方向大小的比值。如VGA显示卡由于偈素基本上是正方形,所以纵横比为1.000。

为了保证几何图形基本按预计情况显示在屏幕上,用屏显的纵横比来计算和纠正不同硬件及显示卡产生的畸变。计算纵横比所需要的水平方向和垂直方向的比例系数可调用函数getaspectratio()获得。

68. getaspectratio()获取纵横比函数

功能: 函数getaspectratio()返回x方向和y方向的比例系数,用这两个整型值可计算某一特定屏显的纵横比。

用法: 此函数调用方式为void getaspectratio(int xasp,int yasp);

说明: 参数xasp指向的变量存放返回的x方向比例系数;参数yasp指向的变量存放返回的y方向比例系数。通常y方向比例系数为10 000, x方向比例系数不大于10 000(这是因为大多数屏幕像素高比宽长)。

注意纵横比自动用作下面函数arc(),circle()和pieslice()中的标尺因子,使屏幕上圆或弧正常显示。但用ellipse()函数画椭圆必须调用本函数获取纵横比作为标尺因子,否则不予调整。纵横比可用于其它几何图形,目的是校正和显示图形。

getaspectratio()函数对应的头文件为graphics.h

返回值: 返回x与y方向比例系数分别存放在xasp和yasp所指向的变量中。

例: 下面的程序显示纵横比:

int xasp,yasp;

float aspectratio;

getaspectratio(xasp,yasp);

aspectratio=xasp/yasp;

printf("aspect ratio: %f",aspectratio);

69. circle()画圆函数

功能: 函数circle()使用当前绘图色并以实线画一个完整的圆。

用法:该函数调用方式为void circle(int x,int y,int radius);

说明: 参数x,y为圆心坐标,radius为圆半径,用像素个素表示。注意,调用circle()函数画圆时不用当前线型。

不同于ellipse()函数,只用单个半径radius参数调用circle()函数,故屏显纵横比可以自动调节,以产生正确的显示图。

此函数对应的头文件为graphics.h

返回值: 无

例: 画六个同心圆,圆心在(100,100)。

#i ncludegraphics.h

void main()

{

int driver,mode;

driver=DETECT;

mode=0;

initgraph(driver,mode,"");

circle(100,100,10);

circle(100,100,20);

circle(100,100,30);

circle(100,100,40);

circle(100,100,50);

circle(100,100,60);

getch();

restorecrtmode();

}

70. arc() 画圆弧函数

功能: 函数arc()使用当前绘图色并以实线画一圆弧。

用法: 函数调用方式为void arc(int x,int y,int startangle,int endangle,int radius);

说明: 参数x,y为圆心坐标,startangle与endangle分别为起始角与终止角,radius为半径。圆心坐标和半径以像素个数给出,起始角和终止角以度为单位,0度位于右边,90度位于顶部,180度位于左边,底部是270度。同往常一样,360度与0度重合。角度按逆时针方向增加,但并不要求终止角一定比起始角大。例如指定300度和90度分别为起始角和终止角,与指定300度和450度分别为起始角和终止角可画出相同的弧。大于360度可作为参数,它将被化到0度 ̄360度范围里。函数arc()能画封闭圆,只要取起始角为0度,终止角为360度即可。此函数中,屏显纵横比可自动调节。

arc()函数对应的头文件为graphics.h

返回值: 无

例: 以(200,200)为圆心,100为半径,从0度到120度画圆弧:

#i ncludegraphics.h

void main()

{

int driver,mode;

driver=DETECT;

mode=0;

initgraph(drivwer,mode,"");

setcolor(WHITE);

arc(200,200,0,120,100);

getch();

restorecrtmode();

}

c语言图形处理函数怎么用

#include iostream

#include windows.h

using namespace std;

/************************************************/

/*参数说明:

char *pszDestPath为需要遍历的目标路径

/************************************************/

EnmuDirectory(char *pszDestPath, int sum)

{

//此结构说明参MSDN

WIN32_FIND_DATA FindFileData;

//查找文件的句柄

HANDLE hListFile;

//绝对路径,例:c:\windows\system32\cmd.exe

char szFullPath[MAX_PATH];

//相对路径

char szFilePath[MAX_PATH];

//构造相对路径

wsprintf(szFilePath, "%s\\*", pszDestPath);

//查找第一个文件,获得查找句柄,如果FindFirstFile返回INVALID_HANDLE_VALUE则返回

if((hListFile = FindFirstFile(szFilePath, FindFileData)) == INVALID_HANDLE_VALUE)

{

//查找文件错误

return 1;

}

else

{

do

{

if( lstrcmp(FindFileData.cFileName, TEXT(".")) == 0 ||

lstrcmp(FindFileData.cFileName, TEXT("..")) == 0 )

{

continue;

}

//构造全路径

wsprintf(szFullPath, "%s\\%s", pszDestPath, FindFileData.cFileName);

//读取文件属性,如果不是文件夹

if(!(FindFileData.dwFileAttributes FILE_ATTRIBUTE_DIRECTORY))

{

char *pszFileType = NULL;

pszFileType = (FindFileData.cFileName[strlen(FindFileData.cFileName) - 3]);

if(!stricmp(pszFileType, "txt"))

{

coutFindFileData.cFileNameendl;

++sum;

}

}

//如果是文件夹,则递归调用EnmuDirectory函数

if(FindFileData.dwFileAttributes FILE_ATTRIBUTE_DIRECTORY)

{

EnmuDirectory(szFullPath, sum);

}

//循环,查找下一个文件

}while(FindNextFile(hListFile, FindFileData));

}

//关闭句柄

FindClose(hListFile);

//清空结构。可有可无的一句代码。函数退出会自动清空。

ZeroMemory(FindFileData, sizeof(FindFileData));

return 0;

}

int main()

{

int sum = 0;

EnmuDirectory("D:", sum);


网站名称:c语言图像函数机器用法 c语言画函数图像例子
URL链接:http://hbruida.cn/article/dopeppo.html