学习目标
- 图像处理概述
- 创建图像和销毁图像
- 实例:图像验证码
- 实例:图像水印效果
- 实例:图像缩略图效果
- 文件上传
图像处理概述
1、开启GD2图像扩展库
- PHP不仅限于只产生HTML的输出,还可以创建与操作多种不同格式的图像文件。PHP提供了一些内置的图像处理函数,也可以使用GD函数库创建新图像或处理已有的图像。目前GD2库支持JPEG、PNG和WBMP格式。
- GD扩展用于动态创建图片,使用C语言编写,开放源代码,现在的版本是2.0,所以称为GD2。
- 开启GD2扩展库:将php.ini中extension=php_gd2.dll选项前的分号去掉,重启。
2、查看图像扩展库GD2是否开启
3、创建图像的大致步骤
在PHP中创建一个图像,大致需要四个步骤:
- 创建画布:创建一个画布,以后的操作都基于此画布操作;
- 绘制图形:在画布上绘制图像轮廓或输入文本;
- 输出图像:也可以另存为;
- 释放资源:释放图像占用的内存资源。
4、画布坐标系说明
下图说明了画布的坐标系。坐标原点位于画布左上角,以像素为单位。
创建图像和销毁图像
1、创建基于已有图像的图像imagecreatefromjpeg()
- 描述:由文件或 URL 创建一个新图象。
语法:
resource imagecreatefrompng ( string \$filename )
- 参数:$filename为图像的完整路径。
- 返回:成功后返回图象资源,失败后返回 FALSE 。
- 提示:imagecreatefromjpeg()和imagecreatefromgif()语法与该函数一样。
2、创建空画布图像imagecreatetruecolor()
- 描述:新建一个真彩色图像,支持24位色,即RGB(256,256,256)。
语法:
resource imagecreatetruecolor ( int \$width , int \$height )
- 参数:$width图像宽度;$height图像高度;
- 返回:成功后返回图象资源,失败后返回 FALSE 。
3、销毁图像资源imagedestroy()
- 描述:销毁一图像。释放与 image图像标识符关联的内存。
语法:
bool imagedestroy ( resource \$image )
- 参数:$image为由imagecreatetruecolor()创建的图像标识符。
图像操作
1、为图像分配颜色imagecolorallocate()
- 语法:int imagecolorallocate(resource $image,int $red,int $green,int $blue)
- 参数:$image图像资源标识符;
- 提示:第一次对 imagecolorallocate()的调用会给图像填充背景色。
2、输出图像到浏览器或保存文件imagejpeg()
- 描述:以 JPG/GIF/PNG 格式将图像输出到浏览器或文件
语法:
bool imagejpeg ( resource \$image [, string \$filename [, int \$quality ]] )
参数:
- $filename,将创建的图像保存到文件;如果省略,则直接在浏览器输出。
- 如果要省略这个参数而提供 quality 参数,使用NULL。
quality 为可选项,范围从 0(最差质量,文件更小)到
100(最佳质量,文件最大)。默认的质量值(大约 75)。
- 提示:imagegif()、imagepng(),与imagejpeg()格式一样,但没有第3个参数。
3、水平地画一行字符串imagestring()
- 描述:水平地画一行字符串
语法:
bool imagestring(resource \$img,int \$font,int \$x,int \$y,string \$s,int \$col)
参数:
- $img 图像资源;
- $font字体大小,取值1、2、3、4、5,使用内置字体;
$x , $y 绘制字符串的开始坐标,一般在字符串左上角;
- $s 代表要绘制的一行字符串;
$col 代表文本颜色。
- $s,代表一行字符串;$col,代表文本颜色;
4、获取画布的宽度和高度
- 宽度:int imagesx ( resource $image )
- 高度:int imagesy ( resource $image )
5、获取内置字体的宽度和高度
- 描述:返回指定字体一个字符宽度或高度的像素值。
- 字体宽度:int imagefontwidth ( int $font )
- 字体高度:int imagefontheight ( int $font )
- 提示:$font为字体大小,取值1-5,最大为5。
6、实例:在图像上绘制一行居中的字符串
写入英文字符串
<?php
// 创建一个画布资源 也可以用来打开一个已有图像
$drawingBoard = imagecreatetruecolor(300, 100);
// 创建需要的颜色
$colorOfBack = imagecolorallocate($drawingBoard, 0, 0, 0);
$colorOfRed = imagecolorallocate($drawingBoard, 225, 0, 0);
// 填充画布背景色
imagefill($drawingBoard, 0, 0, $colorOfBack);
// 获取画布(图像)的宽高
$imageWidth = imagesx($drawingBoard);
$imageHeight = imagesy($drawingBoard);
// 指定字体的大小
$fontSize = 5;
// 获取内置字体的宽高
$fontWidth = imagefontwidth($fontSize);
$fontHeight = imagefontheight($fontSize);
// 定义水印字符串
$strOfWatermark = "Welcome to My Website!";
// 计算文字起始位置
$startOfDrawingX = ($imageWidth - $fontWidth * strlen($strOfWatermark)) / 2;
$startOfDrawingY = ($imageHeight - $fontHeight) / 2;
// 向图片上写入字符串
$drawingResult = imagestring($drawingBoard, $fontSize, $startOfDrawingX, $startOfDrawingY, $strOfWatermark, $colorOfRed);
// html页面输出为图像,不能在设置为输出图像的页面输出文字,会造成图片输出失败!
// if ($drawingResult) {
// echo "添加水印成功!";
// } else {
// echo "添加水印失败!";
// }
// 输出图片到浏览器
header("Content-Type:image/png");
imagepng($drawingBoard);
// 销毁图像资源
imagedestroy($drawingBoard);
7、画一矩形并填充
- 描述:画一矩形并填充
- 语法:**bool imagefilledrectangle ( resource $image , int $x1 , int $y1 ,
int $x2 , int $y2 , int $color )** 参数:
- $x1 , $y1 左上角坐标;
- $x2 , $y2 右上角坐标;
- $color 填充背景色。
8、画一个单一像素
- 描述:画一个单一像素
- 语法:bool imagesetpixel ( resource $image , int $x , int $y , int $color )
说明:imagesetpixel() 在 image图像中用 color颜色在 x,y 坐标(图像左上角为
0,0)上画一个点。
实例:图像验证码
1、绘制图像验证码
2、产生一个指定范围的数组range()
- 描述:建立一个包含指定范围单元的数组
- 语法:array range ( mixed $start , mixed $limit [, number $step = 1 ])
参数:
- $start 指定范围第1个值;
- $limit 指定范围最后1个值;
- $step 指定步长值,必须为正整数,默认为1。
3、合并数组array_merge()
- 描述:合并一个或多个数组
- 语法:array array_merge ( array $array1 [, array $... ] )
- 说明:如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。
4、从数组中随机取出一个或多个单元(下标)
- 描述:从数组中随机取出一个或多个单元
- 语法:mixed array_rand ( array $input [, int $num_req = 1 ] )
- 参数:$input代表当前数组,$num_req指明了你想取出多少个单元。
5、生成更好的随机数
- 描述:生成更好的随机数
- 语法:int mt_rand ( int $min , int $max )
- 参数:min可选的、返回的最小值(默认:0);max可选的、返回的最大值。
代码
<?php
/**
* 实例:利用PHP中GD2模块产生验证码
* (1)创建一个具有数字和字母的数组
* (2)随机从数组中抽取四位有效数字或字母用于添加到画布中
* (3)创建一个画布,并对画布进行一些处理
* (4)将验证码写入画布
* (5)生成图片并输出
* (6)销毁画布
*/
// (1)创建一个具有数字和字母的数组
$randArr = array_merge(range('A', 'Z'), range(0, 9), range('a', 'z'));
shuffle($randArr); // 打乱数组
shuffle($randArr);
// (2)随机从数组中抽取四位有效数字或字母用于添加到画布中
$getNum = array_rand($randArr, 4); // 得到数组内四个随机下标
$verifCode = ''; // 定义一个变量用来接收随机验证码
foreach ($getNum as $index) { // 将获取的4位全部整合在一起
$verifCode .= $randArr[$index];
}
// (3)创建一个画布,并对画布进行一些处理
$boardWidth = 120; // 定义画布的尺寸
$boardHeight = 40;
$fontfile = './font/OCRAEXT.TTF'; // 定义字体路径
$drawingBoard = imagecreatetruecolor($boardWidth, $boardHeight); // 创建画布
$colorOfRand = imagecolorallocate($drawingBoard, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)); // 产生一个随机色
imagefill($drawingBoard, 0, 0, $colorOfRand); // 填充画布随机背景色
// (4)将验证码写入画布
$colorOfRand = imagecolorallocate($drawingBoard, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)); // 产生一个随机色
imagettftext($drawingBoard, 28, 0, 16, 32, $colorOfRand, '/www/wwwroot/demo/PHP/gd2/font/OCRAEXT.TTF', $verifCode); // imagettftext(图像资源,字号大小,旋转角度,X坐标,Y坐标,颜色,字体文件(绝对路径),字符串)
for ($i = 0; $i < 400; $i++) { // 产生一些随机颜色像素点并填充到随机的画布位置
$colorOfRand = imagecolorallocate($drawingBoard, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)); // 产生一个随机色
imagesetpixel($drawingBoard, mt_rand(0, $boardWidth), mt_rand(0, $boardHeight), $colorOfRand);
}
// (5)生成图片并输出
header("Content-Type:image/png");
imagepng($drawingBoard);
// (6)销毁画布
imagedestroy($drawingBoard);
实例:往图像上写入一行汉字
- 描述:用 TrueType 字体向图像写入文本
- 语法:**array imagettftext ( resource $image , float $size , float $angle
, int $x , int $y , int $color , string $fontfile , string $text )** 参数:
- $size,字号大小,自定义,同word字号一样;
- $angle,旋转角度(0~360);
- $x和$y,定义了第一个字符的基本点(大概是字符的左下角)。
- $fontfile,是想要使用的 TrueType 字体的绝对路径;
- $text,UTF-8 编码的文本字符串(其它编码要进行转换)。
实例:制作图像水印效果
- 描述:为图像分配透明颜色imagecolorallocatealpha()
- 语法:int imagecolorallocatealpha ( resource $image , int $red , int $green , int $blue , int $alpha )
说明:imagecolorallocatealpha() 的行为和 imagecolorallocate()
相同,但多了一个额外的透明度参数 alpha,其值从 0 到127。0表示完全不透明,127 表示完全透明。
实例:生成图像缩略图
- 描述:将一幅图像中的一块正方形区域拷贝到另一个图像中,平滑地插入像素值,因此,减小了图像的大小而仍然保持了极大的清晰度。
- 语法:bool imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )
参数:
- $dst_image,目标图像;
- $src_image,源像图;
- $dst_x和$dst_y,目标图像x、y坐标;
- $src_x和$src_y,源图像x、y坐标;
- $dst_w和$dst_h,目标图像的宽度和高度;
- $src_w和$src_h,源图像的宽度和高度;
- 提示:如果源和目标的宽度和高度不同,则会进行相应的图像收缩和拉伸。
<?php
//实例:制作图像缩略图,缩放到原图的一半,图像不会变形
//(1)创建画布:目标画布,原画布
$filename = "./images/img01.jpg";
$src_img = imagecreatefromjpeg($filename); //原画布
$src_w = imagesx($src_img); //原画布宽度
$src_h = imagesy($src_img); //原画布高度
$dst_w = $src_w * 0.5; //目标画布宽度
$dst_h = $src_h * 0.5; //目标画布高度
$dst_img = imagecreatetruecolor($dst_w,$dst_h); //目标画布
//(2)生成缩略图
imagecopyresampled($dst_img,$src_img,0,0,0,0,$dst_w,$dst_h,$src_w,$src_h);
//(3)保存图像,并销毁图像
imagejpeg($dst_img,"./images/s_img01.jpg");
imagedestroy($dst_img);
imagedestroy($src_img);