分类:
2009-03-19 14:59:46
代码 Matlab(转)
1、图像的读取
MATLAB中从图像文件中读取数据用函数imread(),这个函数的作用就是将图像文件的数据读入矩阵中,此外还可以用imfinfo()函数查看图像文件的信息(见例1)
%例1:图像数据及图像信息的读取
imfinfo c:\lilizong\boat.bmp
%读取图像信息
[A,M]=imread('c:\lilizong\boat.bmp');
%图像数据的读取,将图像数据放入矩阵A中,颜色数据放入矩阵M中
imshow(A,M);title('原图像');
M(:,1)=0; %将颜色数据矩阵的一列置零
figure
imshow(A,M);title('改变颜色后的图像')
MATLAB还提供了将数据写入一个文件的函数imwrite以及不同类型文件相互转换的函数,可以参考MATLAB 的帮助文件。
2、灰度直方图及直方图均衡化
灰度直方图用于显示图像的灰度值分布情况,是数字图像处理中最简单和最实用的工具。MATLAB中提供了专门绘制直方图的函数imhist()。用它可以很简单的绘制出一幅图像的灰度直方图(见例2)。
%例2:直方图的显示
imshow('c:\lilizong\boat.bmp');title('原图像')
%显示原图像
A=imread('e:\matlabwork\tuxiang\Girl.bmp','bmp');
figure;imhist(A),title('对应直方图')
在图像处理中,点运算是简单而又重要的一种技术,其中最常用的一种应用就是直方图的均衡化(见例3)。
%例3:直方图均衡化
imshow('c:\lilizong\boat1.bmp');title('原图像')
I=imread('c:\lilizong\boat1.bmp');
figure;imhist(I),title('对应直方图')
%从得到的直方图可以看出,图像的对比度很低,灰度级集中在70-160范围内,如果只取
%这个范围内的灰度,并扩展到[0,255],则会明显增强图像对比度
J=imadjust(I,[70/255 160/255],[]);
figure;imshow(J),title('经灰度级调整后的图')
figure;imhist(J),title('灰度级调整后的直方图')
%MATLAB还提供了histeq函数(自动直方图均衡化)
K=histeq(I);
figure;imshow(K),title('经直方图均衡化后的图')
figure;imhist(K),title('直方图均衡化后的直方图')
3、图像的代数运算
代数运算是指对两幅输入图像进行点对点的加、减、乘和除计算而得到输出图像的运算。对于相加和相乘的情形,可能不止有两幅图像参加运算。图像相加的一个重要应用是对同一场景的多幅图像求平均值。这点被经常用来有效地降低加性(additive)随机噪声的影响(见例4)
%例4:图象加噪声再通过多次相加求平均的方法祛除噪声
[I,M]=imread('c:\boat.png');
J=imnoise(I,'salt & pepper',0.005);
subplot(1,2,1),imshow(I,M),title('原图象');
subplot(1,2,2),imshow(J,M),title('加噪声后图象');
K=zeros(256);
for i=1:100
J=imnoise(I,'salt & pepper',0.005);
J1=im2double(J);
% K=K+J1;
K=K+J1;
end
K=K/100;
figure,imshow(K),title('相加求平均后的图象');
4、图像滤波处理
在数字图像处理中,常常会遇到图像中混杂有许多的噪声。因此,在进行图像处理中,有时要先进行祛除噪声的工作。最常用的祛除噪声的方法是用滤波器进行滤波处理。MATLAB的图像处理工具箱里也设计了许多的滤波器。如均值滤波器、中值滤波器、维纳滤波器等。用户可以很方便的运用一些函数完成数字滤波工作。(见例5)。
%例5:用滤波器祛除图象噪声(分别用均值滤波,中值滤波,及维纳滤波器祛除加入高斯噪声的图象)
I=imread('C:\boat.png');
J=imnoise(I,'gaussian',0,0.002); %加入高斯噪声
%进行均值滤波
h=fspecial('average',3); %fspecial函数用于产生预定义滤波器
I2=uint8(round(filter2(h,I))); %filter2函数用于图像滤波,此处h是滤波参数(均值),I是要处理的图像
%进行中值滤波
I3=medfilt2(J,[3,3]); %medfilt2函数用于图像的中值滤波
%进行维纳滤波
I4=wiener2(J,[3,3]);%进行一次维纳滤波
I5=wiener2(I4,[3,3]);%进行二次维纳滤波
subplot(2,3,1),imshow(I),title('原图象')
subplot(2,3,2),imshow(J),title('加噪声图象')
subplot(2,3,3),imshow(I2),title('均值滤波后图象')
subplot(2,3,4),imshow(I3),title('中值滤波后图象')
subplot(2,3,5),imshow(I4),title('维纳滤波后图象')
subplot(2,3,6),imshow(I5),title('两次维纳滤波后图象')
5、傅立叶变换
傅立叶变换是线性系统分析的一个有力的工具。它在图像处理,特别是在图像增强、复原和压缩中,扮演着非常重要的作用。实际中一般采用一种叫做快速傅立叶变换(FFT)的方法,MATLAB中的fft2指令用于得到二维FFT的结果,ifft2指令用于得到二维FFT逆变换的结果。(见例6)
%例6:近似冲击函数的二维快速傅立叶变换(FFT)
x=1:99;y=1:99;
[X,Y]=meshgrid(x,y);
A=zeros(99,99);
A(49:51,49:51)=1;
B=fft2(A);
subplot(1,2,1),imshow(A),xlabel('空域图象');
subplot(1,2,2),imshow(B),xlabel('时域图象');
figure
subplot(1,2,1),mesh(X,Y,A),xlabel('空域'),grid on;
subplot(1,2,2),mesh(X,Y,abs(B)),xlabel('时域'),grid on;
6、图像压缩
在图像的变换和压缩中,常常用到离散余弦变换(DCT)。DCT具有能使图像的最重要的信息集中在DCT的几个系数上的性能。正是基于此,DCT通常应用于图像的压缩。(见例7)
JPEG图像压缩算法:
输入图像被分成8*8或16*16的小块,然后对每一小块进行二维DCT(离散余弦变换)变换,变换后的系数量化、编码并传输;
JPEG文件解码量化了的DCT系数,对每一块计算二维逆DCT变换,最后把结果块拼接成一个完整的图像。在DCT变换后舍弃那些不严重影响图像重构的接近0的系数。
DCT变换的特点是变换后图像大部分能量集中在左上角,因为左上放映原图像低频部分数据,右下反映原图像高频部分数据。而图像的能量通常集中在低频部分。
%例7:DCT变换用于图象的压缩实例
I=imread('d:\lilizong\test.jpg');
%该图片在安装matlab的目录中找,原图为灰度图象
I=im2double(I);%图像存储类型转换
T=dctmtx(8);%离散余弦变换矩阵
B=blkproc(I,[8 8],'P1*x*P2',T,T');
%对原图像进行DCT变换
mask=[1 1 1 1 0 0 0 0
1 1 1 0 0 0 0 0
1 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0];
B2=blkproc(B,[8 8],'P1.*x',mask);
%数据压缩,丢弃右下角高频数据
I2=blkproc(B2,[8 8],'P1*x*P2',T',T);
%进行DCT反变换,得到压缩后的图像
imshow(I)
title('原始图像')
figure;
imshow(I2)
title('压缩后的图像')
应用到的函数:
I=imread('图像文件名') :读取图像数据,保存在矩阵I中;
imshow(I) :显示灰度图像I,其他用法见matlab帮助;
I2=im2double(I1) :把图像数组I1转换成double精度类型;
D=dctmtx(n) :二维离散余弦变换函数,返回n*n离散余弦变换矩阵。
一个n*n的变换矩阵T被定义成:
Tpq=1/sqrt(n)
,当p=0,0<=q<=M-1;
Tpq=sqrt(2/n)*cos[pi*(2q+1)*p/2n]
,当1<=p<=M-1,0<=q<=M-1。
B=blkproc(A,[m n],fun,P1,P2...) :块操作函数。对图像A的每个不同的m*n块应用fun函数,P1,P2等为fun函数参数。在图像边缘用0来扩展;只有当fun的返回矩阵是m*n矩阵时,B和A的大小才相同。
figure:强制生成一个新的个绘图窗口;
可以看出,尽管由于85%的DCT系数被抛弃而使恢复后的图像质量有所降低,图像内容仍能清晰可辨,达到了图像压缩的目的。
一 读写图像文件
1 imread
imread函数用于读入各种图像文件,如:a=imread('e:\w01.tif')
注:计算机E盘上要有w01相应的.tif文件。
2 imwrite
imwrite函数用于写入图像文件,如:imwrite(a,'e:\w02.tif',’tif’)
3 imfinfo
imfinfo函数用于读取图像文件的有关信息,如:imfinfo('e:\w01.tif')
二 图像的显示
1 image
image函数是MATLAB提供的最原始的图像显示函数,如:
a=[1,2,3,4;4,5,6,7;8,9,10,11,12];
image(a);
2 imshow
imshow函数用于图像文件的显示,如:
i=imread('e:\w01.tif');
imshow(i);
3 colorbar
colorbar函数用显示图像的颜色条,如:
i=imread('e:\w01.tif');
imshow(i);
colorbar;
4 figure
figure函数用于设定图像显示窗口,如:figure(1); /figure(2);
三 图像的变换
1 fft2
fft2函数用于数字图像的二维傅立叶变换,如:
i=imread('e:\w01.tif');
j=fft2(i);
2 ifft2
ifft2函数用于数字图像的二维傅立叶反变换,如:
i=imread('e:\w01.tif');
j=fft2(i);
k=ifft2(j);
3 利用fft2计算二维卷积
利用fft2函数可以计算二维卷积,如:
a=[8,1,6;3,5,7;4,9,2];
b=[1,1,1;1,1,1;1,1,1];
a(8,8)=0;
b(8,8)=0;
c=ifft2(fft2(a).*fft2(b));
c=c(1:5,1:5);
利用conv2(二维卷积函数)校验, 如:
a=[8,1,6;3,5,7;4,9,2];
b=[1,1,1;1,1,1;1,1,1];
c=conv2(a,b);
四 模拟噪声生成函数和预定义滤波器
1 imnoise
imnoise函数用于对图像生成模拟噪声,如:
i=imread('e:\w01.tif');
j=imnoise(i,'gaussian',0,0.02);%模拟高斯噪声
2 fspecial
fspecial函数用于产生预定义滤波器,如:
h=fspecial('sobel');%sobel水平边缘增强滤波器
h=fspecial('gaussian');%高斯低通滤波器
h=fspecial('laplacian');%拉普拉斯滤波器
h=fspecial('log');%高斯拉普拉斯(LoG)滤波器
h=fspecial('average');%均值滤波器
五 图像的增强
1 直方图
imhist函数用于数字图像的直方图显示,如:
i=imread('e:\w01.tif');
imhist(i);
2 直方图均化
histeq函数用于数字图像的直方图均化,如:
i=imread('e:\w01.tif');
j=histeq(i);
3 对比度调整
imadjust函数用于数字图像的对比度调整,如:
i=imread('e:\w01.tif');
j=imadjust(i,[0.3,0.7],[]);
4 对数变换
log函数用于数字图像的对数变换,如:
i=imread('e:\w01.tif');
j=double(i);
k=log(j);
5 基于卷积的图像滤波函数
filter2函数用于图像滤波,如:
i=imread('e:\w01.tif');
h=[1,2,1;0,0,0;-1,-2,-1];
j=filter2(h,i);
6 线性滤波
利用二维卷积conv2滤波, 如:
i=imread('e:\w01.tif');
h=[1,1,1;1,1,1;1,1,1];
h=h/9;
j=conv2(i,h);
7 中值滤波
medfilt2函数用于图像的中值滤波,如:
i=imread('e:\w01.tif');
j=medfilt2(i);
8 锐化
(1)利用Sobel算子锐化图像, 如:
i=imread('e:\w01.tif');
h=[1,2,1;0,0,0;-1,-2,-1];%Sobel算子
j=filter2(h,i);
(2)利用拉氏算子锐化图像, 如:
i=imread('e:\w01.tif');
j=double(i);
h=[0,1,0;1,-4,0;0,1,0];%拉氏算子
k=conv2(j,h,'same');
m=j-k;
六 举例
二维傅立叶变换和二维傅立叶反变换:
i=imread('e:\w01.tif');
figure(1);
imshow(i);
colorbar;
j=fft2(i);
k=fftshift(j);
figure(2);
l=log(abs(k));
imshow(l,[]);
colorbar
n=ifft2(j)/255;
figure(3);
imshow(n);
colorbar;
BMP图像文件格式
BMP图像文件格式是微软公司为其Windows环境设置的标准图像格式,而且 Windows系统软件中还同时内含了一系列支持BMP图像处理的API函数,随着Windows 在世界范围内的不断普及,BMP文件格式无疑也已经成为PC机上的流行图像文件格 式。它的主要特点可以概括为:文件结构与PCX文件格式类似,每个文件只能存放一幅图像;图像数据是否采用压缩方式存放,取决于文件的大小与格式,即压缩处理成为图 像文件的一个选项,用户可以根据需要进行选择。其中,非压缩格式是BMP图像文件所 采用的一种通用格式。但是,如果用户确定将BMP文件格式压缩处理,则Windows设计 了两种压缩方式:如果图像为16色模式,则采用RLE4压缩方式,若图像为256色模式, 则采用RLE8压缩方式。同时,BMP图像文件格式可以存储单色、16色、256色以及真彩 色四种图像数据,,其数据的排列顺序与一般文件不同,它以图像的左下角为起点存储图 像,而不是以图像的左上角为起点;而且BMP图像文件格式中还存在另外一个与众不同 的特点,即其调色板数据所采用的数据结构中,红、绿、蓝三种基色数据的排列顺序也 恰好与其它图像文件格式相反。总之,BMP图像文件格式拥有许多适合于Windows环境 的新特色,而且随着Windows版本的不断更新,微软公司也在不断改进其BMP图像文件 格式,例如:当前BMP图像文件版本中允许采用32位颜色表,而且针对32位Windows 的产生,相应的API函数也在不断地报陈出新,这些无疑都同时促成了BMP文件格式的 不断风靡。但由于BMP文件格式只适合于Windows上的应用软件,而对于DOS环境中的 各种应用软件则无法提供相应的支持手段,因此这无疑是阻碍BMP文件格式的流通程度超过PCX文件格式的一个重要因素。
Windows中定义了两种位图文件类型,即一般位图文件格式与设备无关位图文件格 式。其中,由于设备无关位图(DIB)文件格式具有更强的灵活性与完整的图像数据、 压缩方式等定义。BMP图像文件的结构可以分为如下三个部分:文件头、调色板数据以 及图像数据。其中文件头的长度为固定值54个字节;调色板数据对所有不超过256色的 图像模式都需要进行设置,即使是单色图像模式也不例外,但是对于真彩色图像模式, 其对应的BMP文件结构中却不存在相应调色板数据的设置信息;图像数据既可以采用一 定的压缩算法进行处理,也可以不必对图像数据进行压缩处理,这不仅与图像文件的大小相关,而且也与对应的图像处理软件是否支持经过压缩处理的BMP图像文件相关。以下将分别介绍BMP图像文件结构中的这三个重要组成部分。特别值得注意的是:BMP 图像文件结构设计得相当简单,这无疑有利于图像文件的处理速度,但是同时也使得 BMP图像文件格式具有一定的局限性,即一个BMP图像文件只能存储一幅图像。
BMP图像文件的文件头定义
Windows中将BMP图像文件的文件头分成两个数据结构,其中一个数据结构中包含 BMP文件的类型、大小和打印格式等信息,称为BITMAPFILEHEADERl另外一个数据 结构中则包含BMP文件的尺寸定义等信息,称为BITMAPINFOHEADERl如果图像文 件还需要调色板数据,则将其存放在文件头信息之后。 BITMAPFIlEHEADER数据结构在Windows.h中的定义为:
typedef struCttagBITMAPFIlEHEADER
{
WORD bftype;
DWORD bfsiZe:
WORD bfReservedl;
WORD bgReserved2:
DWORD bfoffBits:
}BITMAPFILEHEADER;
其中,bfrype在图像文件存储空间中的数据地址为0,数据类型为unsignedchar,内 容为固定值"BM",用于标志文件格式,表示该图像文件为BMP文件。
bfsize的数据地址为2,类型为unsignedlong,它以字节为单位,定义位图文件的大 小。
bfReservedl与bfReserved2的数据地址分别为6和8,数据类型则都为unsignedint,二 者都是BMP文件的保留字,没有任何意义,其值必须为0.
bfoffBits的数据地址为10,数据类型为unsignedlong,它以字节为单位,指示图像 数据在文件内的起始地址,即图像数据针对文件头的偏移量。
BITMAPINFOHEADER数据结构用于说明位图的大小,其定义为:
type struttagBITMAPINFOHEADER
{
DWORD biSize:
DWORD biWldth;
DWORD biHeight;
WORD biPlanes:
WORD biBitCount:
DWORD biCOmpression;
DWORD biSiZelmage;
DWORD biXPelsPerMeter:
DWORD biYPelsPerMeter:
DWORD biClrUsed;
DWORD biClrlmportant;
}BITMAPINFOHEADER;
其中,biSize的数据地址为14,数据类型为unsignedlong,它以字节为单位指定数据 结构BITMAPINFOHEADER所占用的存储容量,固定值为40。
biWidth与biHeight的数据地址分别为18和22,数据类型都是unsignedlong,它们分 别以像素为单位,给出该BMP文件所描述位图的宽度与高度。若biHeight的取值为正数, 则表明位图为bottom—up类型的DIB位图,而且位图原点为左下角。若biHeight的取值为 负数,则表明位图为top—down类型的DIB位图,而且位图原点为左上角。
注意:一般位图定义中,这两个字段的取值必须为正数。
biPlanes的数据地址为26,类型为unsignedint,它代表目标设备的平面数必须为1。
biBitCount的数据地址为28,类型为utlsigned Int,它确定每个像素所需要的位数。 当图像为单色时,该字段的取值为1;当图像为16色时,该字段的取值为4;当图像为256 色时,该字段的取值为8;当图像为真彩色时,该字段的取值为24。
biCompression的数据地址为30,类型为unsignedlong,它代表bottom—up类型位图的 压缩类型(注意:t叩—down类型位图不能进行压缩处理),其可能取值及其含义分别为: 若该字段的取值为BI—RGB,则表示文件内的图像数据没有经过压缩处理;若该字段的 取值为BI—RLE8,则表示所压缩的图像数据是256色,采用的压缩方法是RLE8;若该字 段的取值为BI—RLE4,则表示所压缩的图像数据是16色,采用的压缩方法是RLE4;若 该字段的取值为BI—BITFIELDS,则表明图像文件内的数据没有经过压缩处理,而且颜 色表由分别表示每个像素点的红、绿、蓝三原色的双字组成。
注意:BMP文件格式在处理单色或者真彩色图像时,不论图像数据多么庞大,都不 对图像数据进行任何压缩处理。
biSizelmage的数据地址为34,类型为unsignedlong7它以字节为单位,给出该BMP 内图像数据占用的空间大小。若图像文件描述BI—RGB位图,则该字段的值必须设置为0。
biXPelsPerMeter字段与biYPelsPerMeter字段的数据地址分别为38与42,类型都是 unsignedlong,它们分别以每米像素数为单位,给出位图目的设备水平以及垂直方向的 分辨率;其中,应用程序可以根据biXPelsPerMeter字段的值,从源位图组中选择与当前 设备特点最匹配的位图。
biCkUsed的数据地址为46,类型为unsignedlong,给出位图实际使用的颜色表中的 颜色变址数。如果该字段的取值为0,则代表本位图使用了biBitCount字段值所代表的最 大颜色值,其中biBitCount字段的取值与biCompression所指定的压缩方法相关。例如: 如果图像为16色,而该字段的取值为10,则代表本位图共使用了12种颜色;如果该字段 的取值非零,而且biBitCount字段的取值小于16,则该字段指定图像或者设备驱动器存 取的实际颜色数。若biBitCount字段的取值大于或者等于16,则该字段指定使Window 系统调色板达到最优性能的颜色表大小。
biChlmportant的数据地址为50,数据类型为unsignedlong,它给出位图显示过程中 重要颜色的变址数。若该字段的取值为0,则表示所有使用的颜色都是重要颜色。
调色板数据
如果位图的描述还需要调色板数据,则应该在BMP文件头之后定义一个颜色表,它 包含若干个表项。其中,每一个表项定义了一种颜色,Windows将其定义为如下的 RGBQUAD结构:
typedef tagRGBQUAD
{
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
}RGBQUAD;
注意:RGBQUAD数据结构中,增加了一个保留字段rgbReserved,它不代表任何意 义,必须取固定值00同时,RGBQUAD结构定义的颜色值中,红色、绿色与蓝色的排 列顺序与一般图像文件的颜色数据排列顺序恰好相反,即:蓝色的亮度由rgbBlue字段 定义、绿色的亮度由rgbGreen字段定义,红色的亮度由rgbRed字段定义。若位图中某个 像素点的颜色描述为"00,00,FF,00",则表示该点的颜色为纯红色,而不是纯 蓝色。
综上,在DIB位图文件组成中,紧随BITMAPFILEHEADER结构其后的数据结构为 BITMAPINFO,两者共同构成完整的位图文件。Windows将BITMAPINFO结构定义为:
tyPedef stmCt tagBITMAPINFO
{
BITMAPINFOHEADER bmiHeader:
RGBQUAD bmiC010ur[1];
}BITMAPINFO;
其中,bmiHeader字段指向包含位图颜色格式以及大小定义的 BITMAPHEADERINFO结构。bmiCo1our[1]字段指向RGBQUAD结构数组或者定义位图 颜色值的双字数据结构,它定义了BMP图像文件的颜色表,它包含多少个表项是由 BITMAPINFOHEADER数据结构中的biBitCount字段定义的:若该字段的取值为1,则颜 色表中共包含两个表项;若该字段的取值为4,则颜色表中共包含16个表项;若该字段 的取值为8,则颜色表中共包含256个表项;若该字段的取值为16,而且 BITMAPINFOHEADER结构定义中指定bmiColors字段的取值为BI_RGB,则颜色表中的 表项为空,位图阵列中每个字代表一个像素,字中每5位上的值代表该像素点一种基色 的亮度,其中最低5位代表蓝色亮度,依次为绿色与红色,字的最高位没有任何意义。 若该字段的取值为24,则颜色表中的表项为空,而位图阵列的每三个字节代表一个像 素,这3个字节直接定义了像素颜色中蓝、绿、红三种基色的相对亮度。 若该字段的取 值为32,而且BITMAPINFOHEADER结构定义中bmiC010rs字段的取值为BI—RGB,则颜 色表中的表项为空,且位图阵列中的每个双字代表一个像素的三原色亮度构成。 注意:颜色表中的数据应该按照重要性的帧序进行排列。另外,如果应用程序中需 要使用DIB位图,则bmiColors字段可以为16位的无符号整数数组,这些整数指定当前逻 辑调色板的颜色索引,而不是显式的RGB值。当然,如果位图存储在文件中或者需要传 送到其它应用程序,则该字段中不能包含调色板索引值。
c语言中图形处理函数
第一部分 图形系统管理
一 c语言中的图形处理需要包含头文件#include
还要初始化 方法是initgraph(&gdriver,&gmode,"tc所在的文件夹");(如"I:\\tc")
但是之前是需要定义int gdriver=DETECT,gmode;
这里gdriver=DETECT是让系统自动检测图形适配器的最高分辨模式的,并装入相应的图形驱动程序
gdriver是一个整型值
DETECT 0
CGA 1
MCGA 2
EGA 3
EGA64 4
EGAMONO 5
IBM8514 6
HERCOMONO 7
ATT400 8
VGA 9
PC3270 10
表一
gmode是一个整型值,用来设置图形的显示模式的
二 关闭图形方式
closegraph();
三 设置视图区
setviewport(x1,y1,x2,y2,c);
x1,y1为视图区 的左上角坐标,
x2,y2为视图区 的左下角坐标;
c为裁剪状态参数c=1时,则自动裁剪超出图形部分的部分,当c=0时,则超出的部分不做裁剪处理
四 清除视图区
cleardevice();
第二部分 绘图函数
一直线类
1,line 画直线
line(x1,y1,x2,y2);
x1,y1,x2,y2为直线两端点坐标;
注意x1,y1,x2,y2均为整型 而且是绝对坐标,不能用变量
2,lineto 从当前点到指定位置画直线
lineto(x,y);
3,moveto(x,y);
移动当前点;
4,linerel(dx,dy);
dx dy均为增量
5,moverel(dx,dy);
与moveto相似,dxdy 均为增量;
二 画弧类函数
1,circle(画圆)
circle(x,y,r);
x,y为整型表示圆形中心坐标,r表示半径
2,acr(x,y,angs,ange,r);
ange,ange:分别为圆弧的起始角和终止角;
3,ellips(画椭圆)
ellipse(x,y,angs.ange,xr,yr);
x,y 为椭圆的中心坐标.
angs,ange;分别为椭圆弧的起始角和终止角,单位为度
xr,yr分别为椭圆的水平半轴和竖直
三 多边形
1,rectangle 画矩形
rectangle(x1,y1,x2,y2);
参数 均为整型;
以 x1,y1为左上角顶点,以x2,y2 为右下角顶点坐标
2,drawpoly 画多变折线
调用格式为drawpoly(nps,*pxy);
nps表示顶点的个数,*pxy是一个数组名,存放顶点坐标的序列.
第三部分 图形属性控制
1,setbkcolor(color);函数
color为一个整型数据,代表索取的颜色,也可以用整型常数,符号常数
见表
BLACK 0 黑色
BLUE 1 蓝色
GREEN 2 绿色
CYAN 3 青色
RED 4 红色
MAGENTA 5 紫红色
BROWN 6 棕色
LIGHTGRAY 7 浅灰色
DARKGRAY 8 深灰色
LIGHTBULE 9 浅蓝色
LIGHTGREEN 10 浅绿色
LIGHTCYAN 11 淡青色
LIGHTRED 12 浅红色
LIGHTMAGENTA 13 淡紫色
YELLOW 14 黄色
WHITE 15 白色
表 二
2,setcolor(color);
设置前景颜色 参数同上;
3,setlinestyle(sty,pat,b);
sty:为整型值,用来定义所画直线的类型见表三
pat:为无符号数,该参数需要用户定义线型时使用,
如果时使用前四种系统预定义的线型,则该参数为0
b:为整型数,指定所画直线的粗细,以象素为单位,见表四;
符号名 数值 含义
SOLID_LINE 0 实线(缺省)
DOTTED_LINE 1 点线
CENTER_LINE 2 中心线
DASHED_LINE 3 虚线
USERBIT_LINE 4 用户定义类型
表三
符号名 数值 含义
NORM-WIDTH 1 1个象素宽
THICK_WIDTH 3 3个象素宽
表四
4,setfillstyle函数
setfillstyle(pattern,color);
pattern 用于指定充填模式,系统共有11种(表五)
符号名 数值 含义
ENPTY_FILL 0 用背景色填充
SOLID_FILL 1 用指定颜色填充
LINE_FILL 2 用线填充
LTSLASH_FILL 3 用斜线填充
SLASH_FILL 4 用粗斜线填充
BKSLASH_FILL 5 用粗反斜线填充
LTBKSLASH_FILL 6 用反斜线填充
HATCH_FILL 7 用网格线填充
XHATCH_FILL 8 用斜交叉线填充
INTERLEAVE_FILL 9 用间隔线填充
WINEDEDOT_FILL 10 用稀疏点填充
CLOSEDOT_FILL 11 用密集点填充
USER_FILL 12 用户自定义填充
表五
floodfill函数
floodfill(x,y,bcolor);
x,y 指位于充填区域任意一点的坐标
bcolor为填充边界颜色
第四部分 文本输出
settextstyle(font,direction,csize);
font :是一个整型数,用来指定所使用的字体见表六
direction:指定文本输出方向;0:从左到右,1从上到下;
符号名 数值 含义
DEFAULT_FONT 0 8*8位图字体(缺省)
TRIPLEX_FONT 1 三重矢量字体
SMALL_FONT 2 小号字体
SANSSERIF_FONT 3 无衬线矢量字体
GOTHIC_FONT 4 哥特矢量字体
表六
2,outtext函数
outtext(*text)
text是字符串
例如outtext("hello!");
3,outtextxy
outtextxy(x,y,*text);
x,y为指定点坐标,text为字符串.
下面举几个例子
一
是一个简单的直线图形,它是由矩形的长取等分点连线组成的.绘图程序如下
#include
main()
{int x;
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"I\\tc");
cleardevice();
setbkcolor(10);
for(x=160;x<=480;x+=20)
{line(160,240,x,120);
line(160,240,x,360);
line(480,240,640-x,360);
line(480,240,640-x,120);
}
getch();
closegraph();
}
二
金刚石图案
将半径为R的圆周等分为n份,然后用直线将各等分点两两链接,这样形成的图案成为金刚石图案
程序如下
#include
#include
main()
{float t;
int x0=320,y0=240;
int n,i,j,r;
int x[50],y[50];
int gdriver=DETECT,gmode;
printf("input n(23-31)and r(r100-200)\n");
scanf("%d,%d",&n,&r);
initgraph(&gdriver,&gmode,"I:\\tc");
cleardevice();
setbkcolor(8);
setcolor(4);
t=6.28318/n;
for(i=0;i {x=r*cos(i*t)+x0; y=r*sin(i*t)+y0; } for(i=0;i<=n-2;i++) { for(j=i+1;j<=n-1;j++) line(x,y,x[j],y[j]); } getch(); closegraph(); } 三 飘带图案 程序如下 #include #include #define PI 3.1415926 main() {int x1,y1,x2,px=320,py=240; double a; int gdriver=DETECT,gmode; initgraph(&gdriver,&gmode,"I:\\tc"); cleardevice(); setbkcolor(9); setcolor(4); for(a=0;a<=PI;a+=PI/380) {x1=280*cos(1.6*a)+px; y1=479-((90*sin(8*a))*cos(a/2.5)+py); x2=280*cos(1.8*a)+px; line(x1,y1,x2,y1); } getch(); closegraph(); } 四 图形文字 改程序的运行结果是:对你的hello 由小到大逐渐推向屏幕中央.程序重的函数"delay" 用于延迟执行的时间,因为如果执行太快看不到字符串变化的过程.延迟时间可通过t控制; #include #include main() { int i,t,x=300,y=80; int gdriver=DETECT,gmode; initgraph(&gdriver,&gmode,"I:\\tc"); setbkcolor(9); setcolor(4); printf("input delay time(1--10):"); scanf("%d",&t); for(i=1;i<=10;i++) {x=x-15; y=y+15; settextstle(1,0,i); cleardevice(); outtextxy(x,y,"hello"); delay(100*t); } getch(); closegraph(); } 第四部分 文本输出 settextstyle(font,direction,csize); font :是一个整型数,用来指定所使用的字体见表六 direction:指定文本输出方向;0:从左到右,1从上到下; 符号名 数值 含义 DEFAULT_FONT 0 8*8位图字体(缺省) TRIPLEX_FONT 1 三重矢量字体 SMALL_FONT 2 小号字体 SANSSERIF_FONT 3 无衬线矢量字体 GOTHIC_FONT 4 哥特矢量字体 表六 2,outtext函数 outtext(*text) text是字符串 例如outtext("hello!"); 3,outtextxy outtextxy(x,y,*text); x,y为指定点坐标,text为字符串. 下面举几个例子 一 是一个简单的直线图形,它是由矩形的长取等分点连线组成的.绘图程序如下 #include main() {int x; int gdriver=DETECT,gmode; initgraph(&gdriver,&gmode,"I\\tc"); cleardevice(); setbkcolor(10); for(x=160;x<=480;x+=20) {line(160,240,x,120); line(160,240,x,360); line(480,240,640-x,360); line(480,240,640-x,120); } getch(); closegraph(); }