PHP图像处理之画图
一、PHP图像处理的过程
1、画图,一般画验证码, 统计图。前提条件:安装GD库--- LAMP环境安装
(1)创建画布 --- 创建资源类型 --- 高度 宽度
resource imagecreate ( int x_size, int y_size ); //新建一个基于调色板的图像
resource imagecreatetruecolor ( int x_size, int y_size ) //新建一个真彩色图像,一般用这个
(2)绘制图像
制定各种颜色 $red=imagecolorallocate($img, 255, 0, 0); //为一幅图像分配颜色
矩形, 圆, 点, 线段, 扇形, 画字(字符, 字符串, freetype)
每一个图像对应一个函数
(3)输出图像/保存处理好的图像
1. 输出各种类型(gif, png, jpeg)
imagegif();
imagejpeg();
imagepng();
(4)释放资源
imagedestroy($img); //释放资源
二、PHP处理图像常用到的函数介绍
<?php
//step 1创建图片资源
$img=imagecreatetruecolor(200, 200);
// $img=imagecreate(200, 200);
$red=imagecolorallocate($img, 255, 0, 0); //为一幅图像分配颜色
$yellow=imagecolorallocate($img, 255, 255, 0);
$green=imagecolorallocate($img, 0, 255, 0);
$blue=imagecolorallocate($img, 0, 0, 255);
imagefill($img, 0, 0, $yellow); //为图像区域填充颜色,一幅图的左上角的坐标是:0,0 向左移是整数移,向下移是整数移
//step 2画各种图形
//画一个矩形并填充
imagefilledrectangle($img, 10, 10, 80, 80, $green); //第一个参数为图像资源参数,其左上角坐标为10,10 、右下角坐标为80,80,后面的参数是为图像分配颜色的参数
//画一个矩形
imagerectangle($img, 90, 10, 190, 80, $green);
//线段
imageline($img,0, 0, 200, 200 ,$blue); //线段开始点的坐标是:0,0、结束点的坐标是:200,200
imageline($img,200, 0, 0, 200, $blue);
//点
imagesetpixel($img,50, 50 ,$red);
imagesetpixel($img,55, 50 ,$red);
imagesetpixel($img,59, 50 ,$red);
imagesetpixel($img,64, 50 ,$red);
imagesetpixel($img,72, 50 ,$red);
//圆
// imageellipse ( resource $image , int $cx , int $cy , int $w , int $h , int $color )
//imageellipse() 在 image 所代表的图像中画一个中心为 cx,cy(图像左上角为 0, 0)的椭圆。w 和 h 分别指定了椭圆的宽度和高度,椭圆的颜色由 color 指定。
imageellipse($img, 100, 100, 100, 100,$green);
//圆
imagefilledellipse($img, 100, 100, 10, 10,$blue);
//step3 输出或保存图像
header("Content-Type:image/gif");
imagegif($img);
//释放资源
imagedestroy($img)
?>
三、创建一个 3D 效果的饼状图
<?php
//step 1创建图片资源
$img=imagecreatetruecolor(200, 200);
$white=imagecolorallocate($img, 255, 255, 255);
$gray=imagecolorallocate($img, 0xC0, 0xC0, 0xC0);
$darkgray=imagecolorallocate($img, 0x90, 0x90, 0x90);
$navy=imagecolorallocate($img, 0, 0, 0x80);
$darknavy=imagecolorallocate($img, 0, 0, 0x50);
$red= imagecolorallocate($img, 0xFF, 0, 0);
$darkred=imagecolorallocate($img, 0x90, 0, 0);
imagefill($img, 0, 0, $white);
//3D效果
for($i=60; $i>50; $i--){
//imagefilledarc()画一椭圆弧且填充
//bool imagefilledarc ( resource $image , int $cx , int $cy , int $w , int $h , int $s , int $e , int $color , int $style )
//imagefilledarc() 在 image 所代表的图像中以 cx,cy(图像左上角为 0, 0)画一椭圆弧。成功时返回 TRUE, 或者在失败时返回 FALSE.w 和 h 分别指定了椭圆的宽和高,s 和 e 参数以角度指定了起始和结束点。style 可以是下列值按位或(OR)后的值:
//1.IMG_ARC_PIE 2.IMG_ARC_CHORD 3.IMG_ARC_NOFILL 4.IMG_ARC_EDGED
//IMG_ARC_PIE 和 IMG_ARC_CHORD 是互斥的;IMG_ARC_CHORD 只是用直线连接了起始和结束点,IMG_ARC_PIE 则产生圆形边界(如果两个都用,IMG_ARC_CHORD 生效)。IMG_ARC_NOFILL 指明弧或弦只有轮廓,不填充。IMG_ARC_EDGED 指明用直线将起始和结束点与中心点相连,和 IMG_ARC_NOFILL 一起使用是画饼状图轮廓的好方法(而不用填充)。
imagefilledarc($img, 50, $i,100, 50, -160, 40, $darkgray, IMG_ARC_PIE);
imagefilledarc($img, 50, $i,100, 50, 40, 75, $darknavy, IMG_ARC_PIE);
imagefilledarc($img, 50, $i,100, 50, 75, 200, $darkred, IMG_ARC_PIE);
}
imagefilledarc($img, 50, $i,100, 50, -160, 40, $gray, IMG_ARC_PIE);
imagefilledarc($img, 50, $i,100, 50, 40, 75, $navy, IMG_ARC_PIE);
imagefilledarc($img, 50, $i,100, 50, 75, 200, $red, IMG_ARC_PIE);
header("Content-Type:image/gif");
imagegif($img);
//释放资源
imagedestroy($img);
?>
四、向图像中写入字符、字符串、中文文字
<?php
//step 1创建图片资源
$img=imagecreatetruecolor(200, 200);
$white=imagecolorallocate($img, 255, 255, 255);
$gray=imagecolorallocate($img, 0xC0, 0xC0, 0xC0);
$darkgray=imagecolorallocate($img, 0x90, 0x90, 0x90);
$navy=imagecolorallocate($img, 0, 0, 0x80);
$darknavy=imagecolorallocate($img, 0, 0, 0x50);
$red= imagecolorallocate($img, 0xFF, 0, 0);
$darkred=imagecolorallocate($img, 0x90, 0, 0);
imagefill($img, 0, 0, $gray);
imagechar($img, 5, 100, 100, "A", $red); //水平地画一个字符,第二个参数是int $font 是 1,2,3,4 或 5使用的是内置的字体大小,100,100是其坐标(即左上角坐标)
imagechar($img, 5, 120, 120, "B", $red);
imagecharup($img, 5, 60, 60, "C", $red); //垂直地画一个字符(只画一个)
imagecharup($img, 5, 80, 80, "D", $red);
imagestring($img, 3, 10, 10, "Hello", $navy); //水平地画一行字符串,第二个参数表示字体的大小,后面的参数是画上去的图像颜色
imagestringup($img, 3, 10, 80, "Hello", $navy); //垂直地画一行字符串,第二个参数表示字体的大小,后面的参数是画上去的图像颜色
//array imagettftext ( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text )
//float $angle 角度制表示的角度,0 度为从左向右读的文本。更高数值表示逆时针旋转。例如 90 度表示从下向上读的文本。
imagettftext($img, 25, 60, 150, 150, $red, "simkai.ttf", "高洛峰"); //用 simkai.ttf(TrueType) 字体向图像写入文本,simkai.ttf是中文楷体的字体库,在c:\windows\font\文件夹下有各种字体库
imagettftext($img, 12, -60, 50, 150, $red, "simli.ttf", "中国字");
header("Content-Type:image/gif");
imagegif($img);
//释放资源
imagedestroy($img)
?>