PHP库之GD图形设计

GD库创建图片

初试牛刀

  • 函数
    • imagecreate() 创建画布
    • imagecolorallocate() 给画布分配颜色
    • imagejpeg() 将图片以jpeg格式输出
    • imagegif() 将图片以gif格式输出
    • imagepng() 将图片以png格式输出
<?php
$img= imagecreate(560, 320);            //创建画布
imagecolorallocate($img, 255, 25, 0);   //给图片分配第一个颜色,默认是背景色
header('content-type:image/jpeg');      //告知浏览器用jpg格式显示
imagejpeg($img);                        //用jpg格式显示图片
?>
<?php
$img= imagecreate(560, 320);            //创建画布
imagecolorallocate($img, 255, 25, 0);   //给图片分配第一个颜色,默认是背景色
imagejpeg($img,'./tu.jpg');             //保存图片(不需要设置header头)
?>

填充颜色

  • 函数
    • imagefill() 填充颜色
<?php
$img=imagecreate(200,100);	//创建图片资源
$color=imagecolorallocate($img,200,200,200);
//更改背景色
switch(rand(1,100)%3) {
	case 0:
		$color=imagecolorallocate($img,255,0,0);	
		break;
	case 1:
		$color=imagecolorallocate($img,0,255,0);
		break;
	default:
		$color=imagecolorallocate($img,0,0,255);
}
//填充颜色
imagefill($img, 0, 0, $color);	
//显示图片
header('content-type:image/png');
imagepng($img);
?>

验证码

  • 作用

    • 防止暴力破解
  • 函数

    • range() 创建一个包含指定范围的元素的数组
    • array_merge() 把一个或多个数组合并为一个数组
    • array_diff() 返回两个数组的差集数组
    • array_rand() 从数组中随机选出一个或多个元素,并返回
    • shuffle() 把数组中的元素按随机顺序重新排列
    • imagesx() 获取图像宽度
    • imagefontwidth() 取得字体宽度
    • strlen() 返回字符串的长度
    • imagesy() 获取图像高度
    • imagefontheight() 取得字体高度
    • imagestring(图片资源,内置字体,起始点x,起始点y,字符串,颜色编号) 将字符串写到图片上
<?php
//第一步:创建随机字符串
//1.1  创建字符数组
$all_array=array_merge(range('a','z'),range('A','Z'),range(0,9));	//所有字符数组
$div_array=['1','l','0','o','O','I'];	//去除容易混淆的字符
$array=array_diff($all_array,$div_array);	//剩余的字符数组
unset($all_array,$div_array);		//销毁不需要使用的数组
//1.2	随机获取4个字符
$index=array_rand($array,4);	//随机取4个字符,返回字符下标,按先后顺序排列
shuffle($index);	//打乱字符
//1.3	通过下标拼接字符串
$code='';
foreach($index as $i){
	$code.=$array[$i];
}
//第二步:创建画布
$img=imagecreate(150,30);
imagecolorallocate($img,255,0,0);			//分配背景色
$color=imagecolorallocate($img,255,255,255);	//分配前景色
//第三步:将字符串写到画布上
$font=5;		//内置5号字体
$x=(imagesx($img)-imagefontwidth($font)*strlen($code))/2;
$y=(imagesy($img)-imagefontheight($font))/2;
imagestring($img,$font,$x,$y,$code,$color);
//显示验证码
header('content-type:image/gif');
imagegif($img);
?>

打开图片创建验证码

  • 函数
    • imagecreatefromjpeg() 打开jpg创建图片资源
    • imagecreatefrompng() 打开png创建图片资源
    • imagecreatefromgif() 打开gif创建图片资源
<?php
//第一步:生成随机字符串
$codeSet='2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY';
$code='';
$max=strlen($codeSet);
for($i=1;$i<=4;$i++){
	$index=rand(0,$max-1);
	$code.=$codeSet[$index];
}
//第二步:打开图片
$path='./captcha/captcha_bg'.rand(1,5).'.jpg';
$img=imagecreatefromjpeg($path);
//第三步:将字符串写到图片上
$font=5;		//内置5号字体
$x=(imagesx($img)-imagefontwidth($font)*strlen($code))/2;
$y=(imagesy($img)-imagefontheight($font))/2;
//随机前景色
$color=imagecolorallocate($img,255,255,255);	//设置背景色
if(rand(1,100)%2)
	$color=imagecolorallocate($img,255,0,0);	//设置背景色	
imagestring($img,$font,$x,$y,$code,$color);
//显示验证码
header('content-type:image/gif');
imagegif($img);
?>

中文验证码

  • 函数
    • mb_strlen() 获取其字符个数,一是要开启mbstring扩展,二是要指定字符集
    • mb_substr()` 返回字符串的一部分
    • imagettfbbox() 测定中文字体的范围
    • imagettftext() 将中文字体写到图片上
<?php
//第一步:生成随机字符串
$codeSet='们以我到他会作时要动国产的一是工就年阶义发成部民可出能方进在了不和有大这主中人上为来';
$max=mb_strlen($codeSet)-1;	//中文字符的最大索引号
$code='';
for($i=0; $i<4; $i++) {
	$start=rand(0,$max);
	$code.=mb_substr($codeSet,$start,1);
}
//第二步:创建画布
$img=imagecreate(150,40);
imagecolorallocate($img,255,0,0);
//第三步:将字符串写到画布上
//3.1  指定字符串的参数
$color=imagecolorallocate($img,255,255,255);
$size=15;	//字号
$angle=0;	//角度
$fontfile='D:/Program Files/xampp/htdocs/ttf/simhei.ttf';	//字体路径
//3.2 测定字符串的范围
$info=imagettfbbox($size,$angle,$fontfile,$code);
$code_w=$info[4]-$info[6];	//字符串的宽度
$code_h=$info[1]-$info[7];	//字符串的高度

$x=(imagesx($img)-$code_w)/2;	//起始点的$x
$y=(imagesy($img)+$code_h)/2;	//起始点的$y
//3.3  将中文字符串写到画布上
imagettftext($img,$size,$angle,$x,$y,$color,$fontfile,$code);	//将文字写到画布上
//显示验证码
header('content-type:image/jpeg');
imagejpeg($img);
?>

验证码改错

  • 概述

    • 验证码错误不会报具体的错误信息
  • 解决方案

    • 注释header,注释掉header后,错误信息就出来了
    • 如果没有报错,就留心一下图片代码前有无字符串输出,图片前面是不允许有任何字符串输出的
    • 查看源码,图片代码前不能有空白字符
    • 如果上面的三招无效,在header()前添加ob_clean();

水印

文字水印

<?php
//第一步:打开图片
$img=imagecreatefromjpeg('./tu.jpg');
//第二步:将文字写到图片上
$color=imagecolorallocate($img,255,114,35);
$size=35;	//字号
$angle=0;	//角度
$fontfile='D:/Program Files/xampp/htdocs/ttf/simhei.ttf';	//字体路径
$code='我爱北京天安门';

$info=imagettfbbox($size,$angle,$fontfile,$code);
$code_w=$info[4]-$info[6];	//字符串的宽度
$code_h=$info[1]-$info[7];	//字符串的高度

$x=imagesx($img)-$code_w;	//起始点的$x
$y=imagesy($img)-$code_h;	//起始点的$y
//将中文字符串写到画布上
imagettftext($img,$size,$angle,$x,$y,$color,$fontfile,$code);	//将文字写到画布上
//第三步:保存图片
header('content-type:image/jpeg');
imagejpeg($img);
?>

图片水印

  • 原理

    • 将水印图片拷贝复制到目标图片上
  • 函数

    • imagecopy() 图片拷贝
<?php
//第一步:打开源图
$src_img=imagecreatefrompng('./5.png');
//第二步:打开目标图
$dst_img=imagecreatefromjpeg('./image1.jpg');
//第三步:将源图复制到目标图上
$dst_x=imagesx($dst_img)-imagesx($src_img);   //开始粘贴的x
$dst_y=imagesy($dst_img)-imagesy($src_img);	  //开始粘贴的y
$src_w=imagesx($src_img);
$src_h=imagesy($src_img);
imagecopy($dst_img,$src_img,$dst_x,$dst_y,0,0,$src_w,$src_h);
//显示水印图
header('content-type:image/jpeg');
imagejpeg($dst_img);
?>

缩略图

  • 原理

    • 上传图片后,将图片变成统一的大小的缩略图
    • 将源图复制拷贝到目标图上,并缩放大小
  • 函数

    • imagecopyresampled() 拷贝图片并缩放大小
<?php
//第一步:创建目标图
$dst_img=imagecreatetruecolor(200,200);
//第二步:打开源图
$src_img=imagecreatefromjpeg('./image1.jpg');
//第三步:复制源图拷贝到目标图上,并缩放大小
$src_w=imagesx($src_img);
$src_h=imagesy($src_img);
imagecopyresampled($dst_img,$src_img,0,0,0,0,200,200,$src_w,$src_h);
//第四步:保存缩略图
header('content-type:image/jpeg');
imagejpeg($dst_img);
?>
posted @ 2020-12-21 16:21  wing1377  阅读(160)  评论(0编辑  收藏  举报