图形和图像函数包含在graphics.h里面
(一) 像素函数
(二) 直线和线型函数
(三)、多边形函数
(四)、 圆、弧和曲线函数
(五)、 填充函数
(六)、图像函数
第四段:图形和图像函数
对许多图形应用程序,直线和曲线是非常有用的.但对有些图形只能靠操作单个像素才能画出.当然如果没有画像素的功能,就无法操作直线和曲线的函数.而且通过大规模使用像素功能,整个图形就可以保存、写、擦除和与屏幕上的原有图形进行叠加.
功能: 函数putpixel() 在图形模式下屏幕上画一个像素点.
用法: 函数调用方式为void putpixel(int x,int y,int color);
说明: 参数x,y为像素点的坐标,color是该像素点的颜色,它可以是颜色符号名,也可以是整型色彩值.
此函数相应的头文件是graphics.h
返回值: 无
功能: 函数getpixel()返回像素点颜色值.
用法: 该函数调用方式为int getpixel(int x,int y);
说明: 参数x,y为像素点坐标.
函数的返回值可以不反映实际彩色值,这取决于调色板的设置情况(参见setpalette()函数).
这个函数相应的头文件为graphics.h
返回值: 返回一个像素点色彩值.
有三个画直线的函数,即line(),lineto(),linerel().这些直线使用整型坐标,并相对于当前图形视口,但不一定受视口限制,如果视口裁剪标志clip为真,那么直线将受到视口边缘截断;如果clip为假,即使终点坐标或新的当前位置在图形视口或屏幕极限之外,直线截断到屏幕极限.
有两种线宽及几种线型可供选择,也可以自己定义线图样.下面分别介绍直线和线型函数.
功能: 函数line()使用当前绘图色、线型及线宽,在给定的两点间画一直线.
用法: 该函数调用方式为void line(int startx,int starty,int endx,int endy);
说明: 参数startx,starty为起点坐标,endx,endy为终点坐标,函数调用前后,图形状态下屏幕光标(一般不可见)当前位置不改变.
此函数相应的头文件为graphics.h
功能: 函数lineto()使用当前绘图色、线型及线宽,从当前位置画一直线到指定位置.
用法: 此函数调用方式为void lineto(int x,int y);
说明: 参数x,y为指定点的坐标,函数调用后,当前位置改变到指定点(x,y).
该函数对应的头文件为graphics.h
功能: 函数linerel() 使用当前绘图色、线型及线宽,从当前位置开始,按指定的水平和垂直偏移距离画一直线.
用法: 这个函数调用方式为void linerel(int dx,int dy);
说明: 参数dx,dy分别是水平偏移距离和垂直偏移距离.
返回值:无
例: 下面的程序为画线函数调用实例:
#i ncludegraphics.h
void main()
{
int driver,mode;
driver=DETECT;
mode=0;
initgraph(driver,mode,"");
lineto(100,100);
getch();
restorecrtmode();
}
功能: setlinestyle() 为画线函数设置当前线型,包括线型、线图样和线宽.
用法: setlinestyle() 函数调用方式为void setlinestyle(int stly,unsigned pattern,int width);
说明: 参数style为线型取值,也可以用相应名称表示,如表1-10中所示.
若用非法参数调用setlinestyle()函数,那么graphresult()会返回错误代码,并且当前线型继续有效.
Turbo C提供的线型与线宽定义在头文件graphics.h中,表1-10和1-11分别列出了参数的取值与含义.
表1-10 线型
-----------------------------------------------------
名 称 取 值 含 义
SOLID_LINE 0 实线
DOTTED_LINE 1 点线
表1-11 线宽
-----------------------------------------------------------
名 称 取 值 说 明
NORM_WIDTH(常宽) 1 一个像素宽(缺省值)
这个函数的头文件是graphics.h
例: 下面的程序显示了BC中所提供的线型图样:
setlinestyle(i,0,1);
功能: 函数getlinesettings() 用当前设置的线型、线图样和线宽填 写linesettingstype型结构.
用法: 函数调用方式为void getlinesettings(struct linesettingstype *info);
说明: 此函数调用执行后,当前的线型、线图样和线宽值被装入info指向的结构里,从而可从该结构中获得线型设置.
linesettingstype型结构定义如下:
struct linesettingstype {
int linestyle;
unsigned upattern;
int thickness;
};
其中linestyle用于存放线型,线型值为表1-10中的各值之一.
thickness为线宽值存放的变量,可参见表1-11.
getlinesettings()函数对应的头文件为graphics.h
返回值: 返回的线型设置存放在info指向的结构中.
例: 把当前线型的设置写入info结构:
struct linesettingstype info;
getlinesettings(info);
功能: 函数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);
对多边形,无疑可用画直线函数来画出它,但直接提供画多边形的函数会给用户很大方便.最常见的多边形有矩形、矩形块(或称条形)、多边形和多边形块,我们还把长方形条块也放到这里一起考虑,虽然它不是多边形,但它的特例就是矩形(块).下面直接介绍画多边形的函数.
功能: 函数rectangle() 用当前绘图色、线型及线宽,画一个给定左上角与右下角的矩形(正方形或长方形).
用法: 此函数调用方式为void rectangle(int left,int top,int right,int bottom);
说明: 参数left,top是左上角点坐标,right,bottom是右下角点坐标.如果有一个以上角点不在当前图形视口内,且裁剪标志clip设置的是真(1),那么调用该函数后,只有在图形视口内的矩形部分才被画出.
这个函数对应的头文件为graphics.h
例: 下面的程序画一些矩形实例:
initgrpah(driver,mode,"");
功能: 函数bar()用当前填充图样和填充色(注意不是给图色)画出一个指定上左上角与右下角的实心长条形(长方块或正方块),但没有四条边线).
用法: bar()函数调用方式为void bar(int left,int top,int right,int bottom);
说明: 参数left,topright,bottom分别为左上角坐标与右下角坐标,它们和调用函数rectangle()的情形相同,调用此函数前,可用setfillstyle()或setfillpattern()设置当前填充图样和填充色.
这 应的头文件为graphics.h
参数topflag相当于一个布尔参数,如果设置为1(真)那么条块上放一顶面;若设置为0(假),则三维条形就没有顶面,这样可使多个三维条形叠加在一起.
要使图形更加美观,可利用函数floodfill()或setfillpattern()来选择填充图样和填充色(参见本小节(五)填充函数 ).
例: 下面的程序画一个条形和条块:
setfillstyle(SOLID-FILL,GREEN);
setfillstyle(SOLID-FILL,RED);
功能: 函数drawpoly() 用当前绘图色、线型及线宽,画一个给定若干点所定义的多边形.
用法: 此函数调用方式为void drawpoly(int pnumber,int *points);
drawpoly()函数对应的头文件为grpahics.h
例: 下面的程序画一个封闭星形图与一个不封闭星形图:
在一个屏幕上画得很圆的图形到另一个屏幕上可能被压扁或拉长,这是因为每一种显示卡与之相应的显示模式都有一个纵横比.纵横比是指像素的水平方向大小与垂直方向大小的比值.如VGA显示卡由于偈素基本上是正方形,所以纵横比为1.000.
为了保证几何图形基本按预计情况显示在屏幕上,用屏显的纵横比来计算和纠正不同硬件及显示卡产生的畸变.计算纵横比所需要的水平方向和垂直方向的比例系数可调用函数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);
功能: 函数circle()使用当前绘图色并以实线画一个完整的圆.
用法:该函数调用方式为void circle(int x,int y,int radius);
说明: 参数x,y为圆心坐标,radius为圆半径,用像素个素表示.注意,调用circle()函数画圆时不用当前线型.
不同于ellipse()函数,只用单个半径radius参数调用circle()函数,故屏显纵横比可以自动调节,以产生正确的显示图.
此函数对应的头文件为graphics.h
例: 画六个同心圆,圆心在(100,100).
circle(100,100,10);
功能: 函数arc()使用当前绘图色并以实线画一圆弧.
用法: 函数调用方式为void arc(int x,int y,int startangle,int endangle,int radius);
arc()函数对应的头文件为graphics.h
initgraph(drivwer,mode,"");
setcolor(WHITE);
一) 像素函数
putpiel() 画像素点函数
getpixel()返回像素色函数
line() 画线函数
lineto() 画线函数
linerel() 相对画线函数
setlinestyle() 设置线型函数
getlinesettings() 获取线型设置函数
setwritemode() 设置画线模式函数
rectangle() 画矩形函数
bar() 画条函数
drawpoly() 画多边形函数
getaspectratio()获取纵横比函数
circle()画圆函数
arc() 画圆弧函数
ellipse()画椭圆弧函数
fillellipse() 画椭圆区函数
pieslice() 画扇区函数
sector() 画椭圆扇区函数
getarccoords()获取圆弧坐标函数
setfillstyle() 设置填充图样和颜色函数
setfillpattern() 设置用户图样函数
floodfill() 填充闭域函数
fillpoly() 填充多边形函数
getfillsettings() 获取填充设置函数
getfillpattern() 获取用户图样设置函数
imagesize() 图像存储大小函数
getimage() 保存图像函数
putimage() 输出图像函数
Tc中用initgraph()函数可以切换到图形模式,用closegraph()可以从图形模式切换回字符模式.
initgraph()和closegraph()都是图形函数,使用图形函数必须包括头文件"graphics.h".
void far i nitgraph(int far *graphdriver, int far *graphmode,char far *pathtodriver);
graphdriver是指向图形驱动序号变量的指针,
graphmode是在graphdriver选定后,指向图形显示模式序号变量的指针,
pathtodriver表示存放图形驱动文件的路径.
图形驱动序号不同,图形驱动文件也不同.序号为VGA图形驱动对应"egavga.bgi"这个图形驱动文件.
"egavga.bgi"一般在 Tc目录下
例如:
-------
#include graphics.h
int Drive,Mode=DETECT;
initgraph(Drive,Mode,""); //图形显示器、显示模式、路径自动检测
运行时需要在当前目录下存在 EGAVGA.BGI文件
在TC\BGI目录底下
如果编译后的.exe文件在另外一个目录(如编译后的.exe文件在D:\MyTc 目录下,而编译器的程序和.BGI文件在C:\Turboc\bin 目录下,则需要填上BGI文件的路径
initgraph(Drive,Mode,"C:\\Turboc\\bgi");
没有什么基于C语言的图像识别材料的,图像识别技术大多讲的都是各种算法.建议搜索一些OpenCV相关的资料,里面会有相关图像识别的内容.个人感觉用OpenCV来入门学习图像识别技术比较好,因为它把复杂的算法封装成API函数了,理解起来比那些枯燥的图像算法书籍要容易的多,因为后者更像是一本数学书,看起来费劲而且容易厌烦.等把OpenCV用熟,需要改某个API函数时,再去理解算法就容易的多
(好了,全部的个人经验)
起始坐标比较好计算,即开始数据串的位置数,分解成大图的行列数.