自学php 学习笔记--php图形处理函数

php php 1295      收藏
熟悉图形处理的流程 制作图片验证码 对图片进行缩略和水印

 自学php博客

在PHP中,通过使用GD扩展库来实现对图像的处理。 PHP不仅可以创建图像,还可以对已有图像进行简单的处理。 更方便的是,PHP不仅可以将处理后的图像以不同格式保存在你的服务器上,还可以直接输出图像到浏览器上。 

    例如验证码、股票走势等图像都是可以由PHP去创建。 

    GD库,是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片。

    作用:图片验证码、缩略、水印。

创建图像流程 

1、创建画布:所有的绘图都需要在一个背景层上完成。而画布实际上就是在内存中开辟了一块临时的内存区域,用于存储图像信息。以后的图形处理都将基于这个背景图层进行操作。 

2、绘制图像:背景层创建完成以后,就可以基于这个背景层使用各种图像函数设置图像的颜色、填充色、画各种图形了。 

3、输出图像:完成整个图像绘制以后,需要将图像以某种格式保存到服务器中,或者直接输出在页面上显示给用户看。 

4、释放资源:将图像被输出后,存储在内存中的存储画布信息的区块就没用了。这个时候需要及时的清除其所占的内存资源。

创建画布 

resource imagecreate(int $x_size, int $y_size) 

<?php     

$img = imagecreate(200,200); 

?> 

resource imagecreatetruecolor(int $x_size, int $y_size)

<?php     

$img = imagecreatetruecolor(200,200); 

?> 

创建颜色 

针对某个画布创建一个颜色//针对一个画布创建的颜色,只能这一个画布使用,其他画布不能使用。

int imagecolorallocate ( resource $image, int $red,int $green, int $blue); 

image:某个画布 

red,green,blue:取值范围 0-255 

该函数有特殊作用:如果我们使用 imagecreate() 函数来创建画布,当我们第一次使用 imagecolorallocate() 时,该函数的作用是为我们的画布设置一个背景颜色。但是对于imagecolorallocate()函数不起作用。

绘制图像-背景色 

区域填充: 给某一个像素点(x,y)设置背景色,并且与此像素点颜色相同且相邻的点都会被填充,另一块颜色不同的点,不会被填充。 

bool imagefill(resource $image, int $x, int $y, int $color) 

$image: 某个画布 $x,$y:像素点的 x轴,y轴 的坐标 

$color:颜色, 即 imagecolorallocate() 

函数的返回值 画布最左上角的点的坐标是 0,0 

矩形填充:在画布上画一个用 color 颜色填充了的矩形,其左上角坐标为 x1,y1,右下角坐标为 x2,y2 

bool imagefilledrectangle(resource $image, int $x1, int $y1,int $x2, int $y2, int $color

$image: 某个画布 

$x1,$y1:矩形左上角点的坐标

$x2,$y2:矩形右下角点的坐标 

$color:颜色, 即 imagecolorallocate() 函数的返回值 

输出图像 

1. 告知浏览器,输送给它的内容,是一张图片,而不是一段文本 

void header(string $string); 

$string的取值范围如下: 

Content-Type:image/jpeg       .jpg图片 

Content-Type:image/png        .png图片 

Content-Type:image/gif        .gif图片 

Content-Type:image/bmp        .bmp图片 

2. 将画布输出到浏览器端 

int imagejpeg(resource $image[, string $filename]) 

int imagepng(resource $image[, string $filename]) 

int imagegif(resource $image[, string $filename]) 

int imagebmp(resource $image[, string $filename]) 

给定参数[, string $filename]的话,图片不再发送给浏览器显示,而是保存在硬盘中。

上述4个函数,分别用来输出  .jpg  .png  .gif  .bmp  格式的图片

-----------------------》补充知识

注意:对于jpg图片,还可以加上第三个函数。int imagejpeg(resource $image[, string $filename],10),用来设置图片的质量,即清晰度,数字越大越清晰,最大值100。如果不填的话,默认值是75。

jpg比png要节省空间。

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

释放资源 

图片输出后,及时释放资源,减少服务器的开销 

bool imagedestroy(resource $image)

创建第一张图片 

imagecreate()方式创建画布 创建一张背景色为蓝色的图片 

<?php      

header('Content-type:image/jpeg');          

$img = imagecreate (200,200);      

$blue = imagecolorallocate($img,0,0,255);     

imagejpeg($img);        

imagedestroy($img); 

?> 

imagecreatetruecolor()方式创建画布 创建一张背景色为蓝色的图片 

<?php      

header('Content-type:image/jpeg');          

$img = imagecreate (200,200);      

$blue = imagecolorallocate($img,0,0,255);     

imagefill($img, 0, 0, $blue);      

imagejpeg($img);        

imagedestroy($img); 

?> 

图片绘制 

在上面的 demo 中,我们生成了一张纯色的图片。 

接下来,我们一起熟悉一下PHP中具体的绘图方式。 

  1. 画点 

  2. 画线 

  3. 写文字 (英文、标点符号、数字)

  4. 写中文字 

1、画点

int imagesetpixel(resource $image, int $x, int $y, int $color) 

$image: 画布 

$x, $y: 确定一个坐标,在此坐标画点 

$color: 点的颜色

<?php    

header(‘Content-type:image/jpeg’); //设定报头       

$img = imagecreate (200,200); //创建画布   

$blue = imagecolorallocate($img,0,0,255); //调色(背景色)   

$white= imagecolorallocate($img,255,255,255); //调色   

for($y=30;$y<100;$y++){ //可以用循环来控制画点

imagesetpixel($img,30,$y,$white); //画点   

}

imagejpeg($img); //输出图像   

imagedestroy($img); //释放资源 

?> 

2、画线

int imageline(resource $image, int $x1, int $y1,int $x2, int $y2, int $color) 

$image: 画布 

$x1, $y1: 确定一个坐标,线条的左端 

$x2, $y2: 确定一个坐标,线条的右端 

$color: 线的颜色

<?php    

header(‘Content-type:image/jpeg’); //设定报头       

$img = imagecreate (200,200); //创建画布   

$blue = imagecolorallocate($img,0,0,255); //调色(背景色)   

$white= imagecolorallocate($img,255,255,255); //调色   

imageline($img,30,30,100,100,$white); //画线   

imagejpeg($img); //输出图像   

imagedestroy($img); //释放资源 

?> 

3、写文字 在php.net中有画图函数库

int imagestring(resource $image, int $font, int $x, int $y,string $value, int $color)  

//在指定点的右方下方来写字。//写中文或者中文的符号,都要乱码。

$image: 画布 

$font : 文字字体大小,取值范围:1-5 

$x, $y: 确定一个坐标,在此坐标开始书写文字 

$value: 要写的内容 

$color: 文字颜色


<?php    

header(‘Content-type:image/jpeg’); //设定报头       

$img = imagecreate (200,200); //创建画布   

$blue = imagecolorallocate($img,0,0,255); //调色(背景色)   

$white= imagecolorallocate($img,255,255,255); //调色   

imagestring($img,5,10,10,'aaaaaaaa', $white); //写文字   

imagejpeg($img); //输出图像   

imagedestroy($img); //释放资源 

?>

 

4、写中文 

array imagettftext(resource $image, int $size, int $angle, int $x, int $y, int $color, string $fontfile, string $value) 

//在指定点的右方上方来写字。如果放在(0,0)位置的话,中文会写到(0,0)上面,文字显示不了。所以x要往下写一点。

//用来写英文也是可以执行的。

$image: 画布 

$size:  文字大小,单位为 px 

$angle: 文字倾斜角度,逆时针旋转。 

$x, $y: 确定一个坐标,在此坐标开始书写文字 

$color: 文字颜色 

$fontfile: 字体文件路径,一般为 .ttf 文件 (服务器上面的字体文件)

$value: 要写的内容  

<?php    

header(‘Content-type:image/jpeg’); //设定报头       

$img = imagecreate (200,200); //创建画布   

$blue = imagecolorallocate($img,0,0,255); //调色(背景色)   

$white= imagecolorallocate($img,255,255,255); //调色   

$value = ‘创恩’;   

$fontfile = ‘simhei.ttf’;   

//写中文   

imagettftext($img,20,10,10,10,$white,$fontfile,$value);    

imagejpeg($img); //输出图像   

imagedestroy($img); //释放资源 

?> 

验证码的访问原理:

处理已有图像 

上述内容,都是用来新建一个图像的,PHP不光可以新建图像,还可以处理一个已有的图像。

处理流程和新建图像类似。 

  1. 以一张现有的图片创建一个画布 

  2. 修改图像 

  3. 输出图像 

  4. 释放资源 

不同点:新建图像时,我们创建的是一个空的画布。处理已有图像时,我们创建的画布是有内容的 

创建画布

resource imagecreatefromgif(string $filename);   从gif文件创建画布 

resource imagecreatefromjpeg(string $filename);  从jpg文件创建画布 

resource imagecreatefrompng(string $filename);   从png文件创建画布 

resource imagecreatefromwbmp(string $filename);  从bmp文件创建画布 

<?php     

$im = imagecreatefromjpeg(“./bg.jpg"); 

?> 

获取画布的大小

从已有图像创建一个画布是,无法设置画布的长宽 通过以下方法,可以获取到画布的长和宽 

 //获取画布宽度  

x int imagesx(resource $image)  

//获取画布高度  

y int imagesy(resource $image)


图片水印

格式: 

int imagecopy ( resource dst_im, resource src_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h) 

参数的意义:

原始图层,水印图层,(创建的图层或者导入的已有图像)

dst_x,dst_y:在原始图层的哪一个点打水印(左上角的坐标) 

src_x,src_y:从水印图层的起始坐标 //不是把整个水印图层放上去,需要选取一个起点,用来决定水印图片选择那一块。

src_w,src_h:水印图层的结束坐标//控制的是水印在大图上的结束坐标点。(本质是水印图片的宽和高) 

上述2组坐标,决定了截取水印图片中的哪一部分图片内容,印在原始图层上 

图片缩略 

int imagecopyresized(resource $im1, resource $im2, int $x, int $y, int $x1, int $y1, int $x2, int $y2, int $x3, int $y3) 拷贝部分图像并调整大小 


int imagecopyresampled(resource $im1, resource $im2, int $x, int $y, int $x1, int $y1, int $x2, int $y2, int $x3, int $y3) 拷贝部分图像并重新进行采样,清晰度更高  

图片缩略-参数详解 

$im1    目标图层(小图)  

$im2    原始图层(大图)  

x,y     目标图层的绘画起始点  

x1,y1    原始图层的截取起始点  

x2,y2    目标图层的绘画结束点  

x3,y3    原始图层的截取结束点 

控制等比例压缩的判断语句:

if($bx>$by){

    $sx=100;//图像横向宽

    $sy=$by/$bx*$sx;

}else{

    $sy=100;//图像纵向长

    $sy=$bx/$by*$sy;

}