在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、画点
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不光可以新建图像,还可以处理一个已有的图像。
处理流程和新建图像类似。
以一张现有的图片创建一个画布
修改图像
输出图像
释放资源
不同点:新建图像时,我们创建的是一个空的画布。处理已有图像时,我们创建的画布是有内容的
创建画布
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;
}
宠物免费领养小程序,欢迎来踩