一 图像操作环境:
1. 开启GD2图像处理并检测
在php.ini开启GD库
2. 画布坐标系说明
二. 图像基本操作(步骤)
1. 创建图像
创建画布(图像资源)
创建的方法:
方法一: 创建真彩色图像
方法二: 基于现有图像创建
2. 绘制图像
如:将字符或汉字写入图像,缩略图,水印图像…..
3. 输出图像
生成的图像在哪个地方显示.
两个地方
1.通过浏览器来显示
Header(‘content-type:image/jpeg’); //设置让浏览器显示图像
Imagejpeg(图像资源); //将图像资源输出
2.图像以文件的形式在操作系统中显示.
Imagejpeg(图像资源,’文件名.jpg’);
如: Imagejpeg(图像资源,’1.jpg’)
4. 销毁图像
将图像资源销毁,目的释放内存.
Imagedestroy(图像资源); //当前页面有多少图像资源就销毁多少.
方法一:创建图片资源生成验证码:
1 <?php 2 // 第一步:创建图像资源 3 4 5 // 方法一:创建真彩色图像 6 // imagecreatetruecolor(width, height); 单位是像素 7 $image = imagecreatetruecolor(100, 30); 8 // 分配颜色 9 // imagecolorallocate(图像资源, red, green, blue);RGB,取值0~255 10 $bgcolor = imagecolorallocate($image,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)); 11 // imagesx($image); //获取画布的宽度 12 // imagesy($image); //获取画布的高度 13 14 15 // 填充背景 16 // imagefill(图像资源,x,y,用什么颜色填充背景); x,y是填充的坐标 17 imagefill($image,0,0,$bgcolor); 18 // 第二步:图像绘制 19 /* 20 绘制图像(建议)的操作方法 21 1.首先将核心的函数(形参)写出来,然后在个形参前加$符号 22 2.在调用函数之前,对个形参从左到右一个一个进行设置 23 */ 24 25 26 27 // 在图片中写入字符串 28 // font 字符串的大小 , x,y 写入时的坐标 string 写入的字符串 color 文字颜色 29 $font = 5; //1~5 30 31 // 验证码开始 32 $str = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890'; 33 $string = substr(str_shuffle($str),0,5); //打乱字符 截取5个字符 34 // 验证码结束 35 36 37 // $string = 'helloworld'; //注意:不支持汉字 38 /* 39 字符水平坐标 40 字符水平坐标 = (画布宽度-所有字符的宽度和)/2 41 字符水平坐标 = (300-所有字符的宽度和)/2 42 字符水平坐标 = (300-一个字符宽度 * 字符个数)/2 43 字符水平坐标 = (300-imagefontwidth($font) * 字符个数)/2 44 字符水平坐标 = (300-imagefontwidth($font) * strlen($string))/2 45 */ 46 $x = ( imagesx($image)-imagefontwidth($font) * strlen($string))/2; 47 /*字符的垂直方向 48 (画布的高度 - 一个字符的高度)/2 49 (200-一个字符的高度)/2 */ 50 $y = ( imagesy($image)-imagefontheight($font))/2; 51 $color = imagecolorallocate($image,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)); 52 imagestring($image, $font, $x, $y, $string, $color); 53 // mt_rand(min,max); 产生随机数 54 // 加入干扰线 55 for ($i=0; $i <15 ; $i++) { 56 $linecolor = imagecolorallocate($image,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)); 57 imageline($image,mt_rand(0,100),mt_rand(0,100),mt_rand(0,100),mt_rand(0,50),$linecolor); 58 } 59 // 加入干扰像素点 60 61 for ($i=0; $i <100 ; $i++) { 62 $pixcolor = imagecolorallocate($image,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)); 63 imagesetpixel($image, mt_rand(0,50), mt_rand(0,50), $pixcolor); 64 } 65 66 67 68 /*// 画圆,弧 69 $cx = 100; 70 $cy = 100; 71 72 $width = 150; 73 $height = 150; 74 75 $start = 0; 76 $end = 360; 77 $color = imagecolorallocate($image,0,255,255); 78 // cx,cy 圆形的坐标, width,height 长轴,短轴 start,end 弧的开始和结束的角度,默认开始的是3点钟方向,顺序是顺时针 color线的颜色 79 imagearc($image, $cx, $cy,$width, $height, $start, $end, $color);*/ 80 81 82 83 84 /*//画矩形 85 // x1,y1 左上角坐标 X2,y2 右下角坐标 86 // imagerectangle(image, x1, y1, x2, y2, color); 87 $x1 = 20; 88 $y1 = 20; 89 90 $x2 = 150; 91 $y2 = 150; 92 $color = imagecolorallocate($image,0,0,255); 93 imagerectangle($image, $x1, $y1, $x2, $y2, $color);*/ 94 95 96 97 98 /*// 画一条直线 99 $x1 = 0; 100 $y1 = 0; 101 102 $x2 = 100; 103 $y2 = 100; 104 $color = imagecolorallocate($image,0,255,0); //红线 105 106 // 调用函数 107 // imageline(图像资源,x1,y1,x2,y2,线的颜色); 108 imageline($image,$x1,$y1,$x2,$y2,$color); 109 */ 110 111 112 113 114 // 方法二:基于现有的图像 115 116 // 第三步:输出图像 117 // 1.通过浏览器来显示 118 // header('content-type:image/jpeg'); 119 header('content-type:image/png'); 120 // imagejpeg(图像资源); 121 imagejpeg($image); 122 123 124 // 2.生成单独文件 125 // imagejpeg($image,'1.jpg'); 126 // 第四步:销毁图像 127 // imagedestroy(图像资源); 128 imagedestroy($image);
方法二: 基于现有的图像生成的验证码:
1 <?php 2 // 第一步:创建图像资源 3 4 5 // 方法二:基于现有的图像 6 $filename = './sucai/code.png'; 7 $image = imagecreatefrompng($filename); 8 9 // 第二步:图像绘制 10 // 将TTF文字字符写入图像 11 // size 字符大小 angle旋转的角度 x,y写入的坐标 color字符颜色 fontfile字体路径 text准备写入的字符 12 $size = 20; 13 $angle = 0; 14 $x = 12; 15 $y = 25; 16 $color = imagecolorallocate($image,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)); 17 $fontfile = './sucai/Candarai.ttf'; 18 // 验证码开始 19 $str = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890'; 20 $text = substr(str_shuffle($str),0,5); //打乱字符 截取5个字符 21 // 验证码结束 22 // $text = '中国江南皮鞋厂专属水印'; 23 imagettftext($image, $size, $angle, $x, $y, $color, $fontfile, $text); 24 25 26 27 28 29 // 第三步:输出图像 30 // 1.通过浏览器来显示 31 // header('content-type:image/jpeg'); 32 header('content-type:image/png'); 33 // imagejpeg(图像资源); 34 imagejpeg($image); 35 36 37 // 2.生成单独文件 38 // imagejpeg($image,'1.jpg'); 39 // 第四步:销毁图像 40 // imagedestroy(图像资源); 41 imagedestroy($image);
五.创建方法:
注意:
1. 方法一: 创建一个真彩色图像
创建一个真彩色图像 (空画布)
为真彩色图像: 分配颜色
为真彩色图像: 填充颜色
注意:
(1) 实例:输出字符串图像,让文本居于图像的正中
(2)实例:随机验证码,随机验证码居中
(3) 实例:加入干扰元素,点与线
2. 方法二: 创建图像(基于现有图像)
Imagecreatefromjpeg(图像路径);
Imagecreatefrompng(图像路径);
Imagecreatefromgif(图像路径);
通过: getimagesize()获取图像信息:
取得图像的宽度和高度
取得字体的宽度和高度
(1) 在图像上写入TTF字体的文本(支持汉字)
imagettftext(image, size, angle, x, y, color, fontfile, text);
1.size //字符大小,没有限制
2.angle //旋转的角度
3.x,y 写入坐标
4.color //字符颜色
5.fontfile //字体的路径
6.text //准备写入的字符
2) 实例:TTF字体的文本
(2) 实例:基于现有图像生成TTF验证码
(3)实例:将验证码植入到表单中
验证码code.php
<?php session_start(); // 第一步:创建图像资源 // 方法二:基于现有的图像 $filename = './sucai/code.png'; $image = imagecreatefrompng($filename); // 第二步:图像绘制 // 将TTF文字字符写入图像 // size 字符大小 angle旋转的角度 x,y写入的坐标 color字符颜色 fontfile字体路径 text准备写入的字符 $size = 20; $angle = 0; $x = 12; $y = 25; $color = imagecolorallocate($image,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)); $fontfile = './sucai/Candarai.ttf'; // 验证码开始 $str = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890'; $text = substr(str_shuffle($str),0,5); //打乱字符 截取5个字符 // 将验证码写入session $_SESSION['checkcode'] = $text; // 验证码结束 // $text = '中国江南皮鞋厂专属水印'; imagettftext($image, $size, $angle, $x, $y, $color, $fontfile, $text); // 第三步:输出图像 // 1.通过浏览器来显示 // header('content-type:image/jpeg'); header('content-type:image/png'); // imagejpeg(图像资源); imagejpeg($image); // 2.生成单独文件 // imagejpeg($image,'1.jpg'); // 第四步:销毁图像 // imagedestroy(图像资源); imagedestroy($image);
(4)通过session对验证码,进行验证
(5)实例:制作图像文字水印效果
(6)实例:上传图片并加入水印文字
1.上传页面: index.php
2.处理页面:upload.php
续上面的代码
(7)实例:生成缩略图
imagecopyresampled(dst_image, src_image, dst_x, dst_y, src_x, src_y, dst_w, dst_h, src_w, src_h)
输出目标图像:缩略图
说明:
Dst_image //目标图像资源
Src_image//源图像资源
Dst_x,dst_y //目标图像取样坐标
Src_x,src_y //源图像的取样坐标
//以上四个坐标都使用0. 等比缩小.
Dst_w,dst_h //目标图像的宽和高
Src_w,src_h //源图像的宽和高
1 <?php 2 // 第一步:创建图像资源 3 4 5 // 方法二:基于现有的图像 6 $src_file = './sucai/1.jpg'; 7 $src_image = imagecreatefromjpeg($filename); 8 9 //imagesx($src_image); //获取画布宽度 10 //imagesy($src_image); //获取画布高度 11 12 // getimagesize($src_image); 13 // list 可以取得数组对应下标的值 14 list($src_w,$src_h)= getimagesize($src_file); 15 $per = 0.5; 16 // 目标宽高 17 $dst_w = $per * $src_w; 18 $dst_h = $per * $src_h; 19 20 $dst_image = imagecreatetruecolor($dst_w,$dst_h); 21 // 第二步:图像绘制 22 //缩略图,将大图等比缩小图 23 imagecopyresampled($dst_image, $src_image, 0, 0, 0, 0, $dst_w, $dst_h, $src_w, $src_h) ; 24 // imagecopyresized(dst_image, src_image, dst_x, dst_y, src_x, src_y, dst_w, dst_h, src_w, src_h); 25 26 // 第三步:输出图像 27 // 1.通过浏览器来显示 28 // header('content-type:image/jpeg'); 29 header('content-type:image/jpeg'); 30 // imagejpeg(图像资源); 31 imagejpeg($dst_image); 32 33 34 // 2.生成单独文件 35 // imagejpeg($image,'1.jpg'); 36 // 第四步:销毁图像 37 // imagedestroy(图像资源); 38 imagedestroy($dst_image); 39 imagedestroy($src_image);
(8)实例:制作图像图片水印效果
imagecopymerge(dst_im, src_im, dst_x, dst_y, src_x, src_y, src_w, src_h, pct)
输出目标图像,源图像一般设置为logo小图.
说明:
dst_im //大图资源
Src_im //小图资源logo
src_x,src_y //小图的左角坐标
dst_x ,dst_y //小图左上角这个点在大图中的坐标
src_w,src_h //小图的宽与高
pct //小图的透明度0-100
1 <?php 2 //第一步: 创建图像 3 //方法二: 基于现有的图像 4 $dst_file = './sucai/1.jpg'; //大图 5 $src_file = './sucai/logo.gif'; //小图 6 7 //目标资源,大图 8 $dst_im = imagecreatefromjpeg($dst_file); 9 //源资源logo 10 $src_im = imagecreatefromgif($src_file); 11 12 //获取源logo的宽与高 13 list($src_w, $src_h ) = getimagesize($src_file); 14 list($dst_w, $dst_h ) = getimagesize($dst_file); 15 16 // imagesx($src_image); //获取画布的宽度 17 // imagesy($src_image); //获取画布的高度 18 //list — 把数组中的值赋给一些变量 19 /*echo "<pre>"; 20 print_r(getimagesize($src_file)); 21 echo "</pre>"; 22 echo "<hr>"; 23 die;*/ 24 //list($src_w,$src_h) = getimagesize($src_file); 25 $dst_x = ($dst_w - $src_w)/2; 26 $dst_y = ($dst_h - $src_h)/2; 27 28 $src_x = 0; 29 $src_y = 0; 30 $pct = 50; //0-100 31 imagecopymerge($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct); 32 33 //第三步: 输出图像 34 header('content-type:image/jpeg'); 35 //imagejpeg(图像资源); 36 imagejpeg($dst_im); 37 38 //第四步: 销毁图像 39 //imagedestroy(图像资源); 40 imagedestroy($dst_im); 41 imagedestroy($src_im); 42 43 ?>