PHP绘图基础

一、绘画的基本操作

1.前提

默认php是不支持绘画技术,需要我们开启php的扩展
php_gd2.dll

2.创建画布

语法:imagecreatetruecolor(w,h)

说明:

  • W 表示所要创建的画布的宽
  • h 表示所要创建的画布的高

3.分配颜色

语法:imagecolorallocate(img,r,g,b);

说明:

  • img 画布资源(gd资源)
  • r,g,b 十进制的颜色表示方式
  • 此函数仅是创建了一个颜色资源,并没有使用

    4.填充颜色

    语法:imagefill(img,x,y,color);

说明:

  • img 画布资源
  • x,y 画布上的某个点
  • color 所要填充的颜色

5.基本图形的绘制

绘制矩形

语法:imagerectangle(img,x1,y1,x2,y2,color)

说明:

  • rectangle 矩形
  • img 画布资源
  • x1,y1 左上角顶点的坐标
  • x2,y2 右下角顶点的坐标
  • color 所要绘制的矩形边角线的颜色

绘制直线

语法:imageline(img,x1,y1,x2,y2,color)

说明:

  • img 画布资源
  • x1,y1 所要绘制的直线的起点坐标
  • x2,y2 所要绘制的直线的终点坐标
  • color 直线的颜色

绘制字母

语法:imagestring(img,size,x,y,string,color);

说明:

  • img 画布资源
  • size 文字大小,0至5个等级
  • x,y 所要绘制内容的左上角位置
  • string 所要绘制的内容
  • color 所要绘制的内容的颜色

问题:

  • imagestring 只适合绘制字母,不能绘制汉字
  • imagestring 所要绘制的字母的大小最大为5
  • imagestring 不能选择字体
  • imagestring 不能设置绘制的角度

绘制汉字

语法:imagettftext(img,size,angle,x,y,color,font,text);

说明:

  • img 画布资源
  • size 大小,单位像素
  • angle 角度
  • x,y 所要绘制的内容的左下角坐标
  • color 所要绘制的内容的颜色
  • font 所要绘制的内容的字体
  • text 所要绘制的内容

扩展:windows操作系统的字体位于c:/windows/fonts

6.输出画布

1
2
3
imagejpeg(img,[,filename])
imagepng(img,[,filename])
imagegif(img,[,filename])

说明:

  • img 画布资源
  • filename 表示是所要保存的文件名,可以省略,如果省略表示输出到浏览器
  • 在输出到浏览器之前必须设置 head(‘content-type:image/gif’)
  • 在将画布输出到浏览器时,不要有任何多余的输出。
  • 如果无法显示图片,需要将head()注释掉,才能看到错误信息

7.从图片创建画布

1
2
3
imagecreatefromjpeg(file)
imagecreatefrompng(file)
imagecreatefromgif(file)

说明:

  • file是说要读取的图片文件,
  • 以上函数会使用file图片的宽高来创建一个画布,并将图片的原内容读取到画布中。

注意:
什么样类型的图片文件就必须使用相应的创建函数。如何获取图片的类型

1
2
$info = getimagesize(file)
$info['mime']

二、验证码

1.什么是验证码

CAPTCHA 全自动区分人与计算机的图灵测试

2.作用

用于区分计算机与人,为了降低在很少的时间内对我们战点的一个访问频率
原理:就是将一串随机生成的字符串画到图片上

3.制作验证码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
/*
* 绘制验证码
* */
$w = 100;
$h = 30;
$len = 4;
putCode($w,$h,$len);
function putCode($w,$h,$len)
{
//1.创建画布
$img = imagecreatetruecolor($w, $h);
//2.分配颜色
$color = imagecolorallocate($img, mt_rand(210, 250), mt_rand(210, 250), mt_rand(210, 250));
//3.填充颜色
imagefill($img, 0, 0, $color);
//4.绘制字母
$code = getCode($len);
for ($i = 0; $i < strlen($code); $i++) {
$color = imagecolorallocate($img, mt_rand(100, 200), mt_rand(100, 200), mt_rand(100, 200));
imagettftext($img, mt_rand(18, 24), mt_rand(-15, 15), 18 * ($i + 1), 25, $color, 'msyh.ttc', $code[$i]);
}
//5.绘制干扰线
for ($i = 0; $i < 5; $i++) {
$color = imagecolorallocate($img, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
imageline($img, mt_rand(0, 100), mt_rand(0, 30), mt_rand(0, 100), mt_rand(0, 30), $color);
}
//6.输出
header('content-type:image/jpg');
imagejpeg($img);
}
//生成随机字符串
function getCode($len){
$charset = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$code = '';
for($i=0;$i<$len;$i++){
$code .= $charset[mt_rand(0,62)];
}
return $code;
}

三、水印

1.水印的作用

版本保护
宣传的目的

2.水印的原理

在用户的图片上,“印上”公司的logo或者写上公司的名字、网址。

3.制作水印

语法:imagecopymerge(dest,src,d_x,d_y,s_x,s_y,s_w,s_h,op);

说明:

  • dest 目标图片(用户图片)
  • src 原图片(公司logo)
  • d_x,d_y 目标图片上的某个点
  • s_x,s_y 原图片上的某个点
  • s_w,s_y 表示宽,高
  • op 表示透明度

在 src 图片从 s_x,s_y 为起点复制 s_w 为宽,s_h 为高的区域放在dest图片以 d_x,d_y 表示的一个点上。

4.示例程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php
//用户上传的图片
$dest = '2.jpg';
$src = 'tx.jpg';
water($dest,$src,2);
/*
* water() 水印函数参数说明
* $dest 用户上传的图片
* $src 水印logo
* $seat 1为左上角,2位右上角,3为左下角,4为右下角,5为中间 默认为1即左上角
* $op 透明度 默认为50
* */
function water($dest,$src,$seat=1,$op=50) //封装制作水印函数
{
$destsize = getimagesize($dest);//取得用户图片的大小
$srcsize = getimagesize($src);//取得水印图的大小
switch ($seat){
case 1:
$d_x = 0;
$d_y = 0;
break;
case 2:
$d_x = $destsize[0] - $srcsize[0];
$d_y = 0;
break;
case 3:
$d_x = 0;
$d_y = $destsize[1] - $srcsize[1];
break;
case 4:
$d_x = $destsize[0] - $srcsize[0];
$d_y = $destsize[1] - $srcsize[1];
break;
case 5:
$d_x = ($destsize[0] - $srcsize[0])/2;
$d_y = ($destsize[1] - $srcsize[1])/2;
break;
}
//将已有图片读取到画布中
$image = createFrom($dest);
$logo = createFrom($src);

//制作水印
imagecopymerge($image, $logo, $d_x, $d_y, 0, 0, $srcsize[0], $srcsize[1], $op);
//输出画布
header('content-type:image/jpg');
imagejpeg($image);
}

function createFrom($file) //将根据图片类型创建画布类型的功能封装成函数
{
$info = getimagesize($file);
switch ($info['mime']) {
case 'image/jpeg':
$img = imagecreatefromjpeg($file);
break;
case 'image/png':
$img = imagecreatefrompng($file);
break;
case 'image/gif':
$img = imagecreatefromgif($file);
break;
}
return $img;
}

四、缩略图

1.缩略图的作用

  1. 节省带宽
  2. 增加用户的体验度

2.缩略图的原理

将用户图片等比例缩放到一个给定的画布中。

3.制作缩略图

语法:imagecopyresampled(dest,src,d_x,d_y,s_x,s_y,d_w,d_h,s_w,s_h);

说明:

  • dest 目标图片(框)
  • src 用户图片
  • d_x,d_y 目标图片上的某个点
  • d_w,d_h 表示宽,高
  • s_x,s_y 原图片上的某个点
  • s_w,s_y 表示宽,高

在 src 上从 s_x,s_y 为起点,截取以 s_w 为宽,s_w 为高的区域放在 dest 画布上以 d_x,d_y 为顶点,以 d_w 为宽,d_h 为高的区域

4.示例程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?php
/**
* 缩略图
*/

$d_w = 1000;
$d_h = 500;
$file = '2.jpg';
thumb($d_w,$d_h,$file);
function thumb($d_w,$d_h,$file)
{
//创建画布(框的大小)
$imgDest = imagecreatetruecolor($d_w, $d_h);

//填充颜色
$color = imagecolorallocate($imgDest, 240, 240, 240);
imagefill($imgDest, 0, 0, $color);

//由用户的图片创建画布
$img = createFrom($file);
$infoSrc = getimagesize($file);
$s_w = $infoSrc[0];//获取用户图片的宽
$s_h = $infoSrc[1];//获取用户图片的高
$f_h = $d_h;
$f_w = $s_w / $s_h * $f_h;
if ($f_w > $d_w) {
$f_w = $d_w;
$f_h = $s_h * $f_w / $s_w;
}
//计算imgDest上所放置的起点位置(居中放置)
$posX = ($d_w - $f_w) / 2;
$posy = ($d_h - $f_h) / 2;
//采样合并
imagecopyresampled($imgDest, $img, $posX, $posy, 0, 0, $f_w, $f_h, $s_w, $s_h);
//输出背景
header('content-type:image/jpg');
imagejpeg($imgDest);
}
function createFrom($file) //将根据图片类型创建画布类型的功能封装成函数
{
$info = getimagesize($file);
switch ($info['mime']) {
case 'image/jpeg':
$img = imagecreatefromjpeg($file);
break;
case 'image/png':
$img = imagecreatefrompng($file);
break;
case 'image/gif':
$img = imagecreatefromgif($file);
break;
}
return $img;
}