DAY32

     第1章 php图像处理技术

1.1 图像处理基本介绍

所谓的PHP图像处理技术,就是通过php的函数进行绘制图像,然后可以输出到浏览器,也可以保存到本地

该绘图技术,需要开启php的一个扩展:GD2,该扩展提供了很多绘制图像的方法

PHP的图像处理技术的应用场景:

验证码(在图像上面绘制一些文字,人类很容易辨别出来,但是计算机脚本以目前的技术辨别图像中的字符是有很大的难度)

图像的压缩(;例如上传头像时,本地的图片很大,但是上传到服务器之后,会针对大图进行压缩处理)

1.2 php绘图坐标体系

在编程世界中坐标体系和我们上学时数学里面的坐标体系不一样的

 

1.3 php绘图的基本步骤

(1) 先开启phpgd扩展,该扩展里面提供了很多绘图函数

打开php.ini配置文件

重启apache服务器

写一个phpinfo函数,测试一下

 

(2) 开始绘制图像

  1. 先在内存中,创建图像资源(理解成画布):imagecreatetruecolor
  2. 给画布分配颜色(默认画布的颜色是真空的黑色):imagecolorallocate()
  3. 给画笔分配颜色 imagecolorallocate
  4. 开始绘制 imageline
  5. 直接在浏览器输出、保存到本地:header()   imagepng()
  6. 销毁画布资源 imagedestroy()

 

1.4 php绘图的具体演示

(1)绘制线条  imageline()

(2)绘制三角形:imageline()

 

(3)绘制矩形:imagerectangle()imagefilledrectangle()

描边矩形:imagerectangle()

填充矩形:imagefilledrectangle()

 

(4)绘制圆形 椭圆形:imageellipse() imagefilledellipse()

描边圆形:imageellipse

填充圆形:imagefilledellipse

(5)将图片绘制到画布上:imagecopy()

 

(6)绘制字符串:imagestring()

 

(7)绘制文字:imagettftext()

指定使用哪个字体来绘制文字

(8)绘制弧形:imagearc()

说明:三点钟的位置是起点(0度)

 

1.5 php绘图小作业

绘制小乌龟(可选的作业

1.6 课后练习题

将某个文件夹下面所有的图片,批量打上泰牛泰牛,越学越牛水印

提示:scandir()  遍历某个目录下面的所有文件、子目录


     第2章 php图像处理技术应用

2.1 验证码的使用

验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、注册刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试

2.2 封装验证码类

(1)封装一个验证码类,先实现能够随机生成不同颜色的背景

 

(2)在生成的图片上面随机的产生文字(字母、数字)

由于随机生成字符的代码肯定会很多,所以我们将生成字符的代码封装到函数中

(3)把随机生成的字符写入到画布中

使用imagettftext()写入,因为可以指定字体文件

如何实现让每个字符所在的位置不一样,倾斜的角度也不一样?
思路:遍历这4个字符,指定每一个字符的位置、倾斜的角度

 

//开始绘制验证码
    public function makeImage()
    {
        //1. 创建画布,背景颜色应该是随机产生的,尽量背景颜色浅一点
        $image = imagecreatetruecolor($this->width, $this->height);
        //2. 分配颜色        
        $color = imagecolorallocate($image, mt_rand(100,255), mt_rand(100,255), mt_rand(100,255));
        imagefill($image, 0, 0, $color);
        
        //3. 开始绘制文字
        $code = $this->makeCode();
        for($i=0;$i<strlen($code);$i++){
            imagettftext($image, $this->font_size, mt_rand(-30,30), ($this->width/$this->number)*$i+5, 20, mt_rand(0,100), $this->font_file, $code[$i]);  
        }        
        //绘制100个干扰像素点
        for($i=0;$i<100;$i++){
            imagesetpixel($image, mt_rand(0,$this->width), mt_rand(0,$this->height), mt_rand(0,100));
        }
        
        //练习:绘制10条干扰线条
        
        //3. 输出到浏览器
        header("Content-Type:image/png");
        imagepng($image);
        //4. 销毁图像资源
        imagedestroy($image);
    }

4)给画布增加一些干扰像素、干扰线条 

2.3 将验证码类应用到案例中

首先我们先创建一个表单:

 

当我们提交表单的时候,拿用户输入的验证码    我们生成的验证码进行比较

如何将生成的验证码保存起来?

需要使用到会话技术:SESSION技术

 


     第3章 php图像压缩处理

3.1 图像压缩介绍

我们之前学习过文件的上传(上传一个头像),但是上传的文件不能直接使用的,因为本地的文件可能会很大,在前端页面显示的时候,就会加载很长时间,所以我们通常会先压缩再使用

通常压缩的时候,一般是按照等比例压缩,所谓的等比例压缩就是宽度、高度同时压缩相同的比例,在实际开发的时候,我们通常会根据具体的需要(前端页面的需求)在指定的范围内进行等比例压缩

3.2 图像压缩入门案例

图像压缩非常简单,就是一个php的图像处理函数:imagecopyresampled

该函数有10个参数:

<?php
//制作缩略图、图像压缩
//参数1:目的地图像资源(通常指的是画布资源)
$dst_image = imagecreatetruecolor(100, 100);
$color = imagecolorallocate($dst_image, 22, 139, 0);
imagefill($dst_image, 0, 0, $color);
//参数2:原图资源(将该图片资源压缩之后,再保存到目的地画布中)
$src_image = imagecreatefrompng('bs.png');
//参数3、4:目的地(画布的起点坐标)
$dst_x = 0;
$dst_y = 0;
//参数5、6:原图的(起点坐标)
$src_x = 0;
$src_y = 0;
//参数7、8:目的地(画布的宽度、高度)
$dst_w = 100;
$dst_h = 100;
//参数9、10:原图的宽度、高度
//通过imagesx()函数获得图像资源的宽度、imagesy()获得图像资源的高度

$src_w = imagesx($src_image);
$src_h = imagesy($src_image);
imagecopyresampled($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h);

//可以保存、也可以输出到浏览器
//1. 直接在浏览器输出
header("Content-Type:image/png");
imagepng($dst_image);

//2. 保存到本地,只需要给imagepng()函数增加第二个参数(保存地址)即可
//imagepng($dst_image,'./thumb_bs.png');

3.3 图像等比例压缩

 假设我们缩放10

但是上面的代码,如果应用到下面的场景中,就不太灵活

 

所以我们要实现:在上面场景中的范围中,生成一个最优的压缩图像

3.4 图像压缩处理类

因为主流的编程思想是:OOP面向对象编程,文件的最新单位是类

思考:

有哪些属性:

原图文件

压缩文件保存的地址

 

有哪些成员方法:

制作压缩图像的方法

 

3.5 完善压缩处理类(支持主流的图像类型(jpg、png、gif))

Jpg -> imagecreatefromjpeg()

Pngàimagecreatefrompng()

Gif-àimagecreatrefromgif()

 

保存图像的时候:

Png---àimagepng()

Gif----àimagegif()

Jpg--àimagejpeg()

 

所以我们先定义属性分别保存创建图像资源、保存图像的函数,将来再通过图像的类型找到对应的创建、生成函数

 

如何获得图像资源的mime类型呢?

Getimagesize函数可以获得图像资源的大小、图像的mime类型

演示:

 

由于我们之前保存了图像的mime类型创建图像资源函数之间的映射关系,所以我们只需要获得图像的mime类型,即可获得创建、生成保存的函数

我们就将这个初始化的操作写到构造函数中,因为构造函数就是用来初始化一些属性、值得

 

完整代码参考:Thumb.class.php类文件

这里省略一部分代码,详细请参考:Thumb.class.php

下一步,根据mime类型,找到对应的函数:

 

再找到保存图像资源的函数:

 

png图像背景都是透明的
使用imagecolortransparent()进行透明化处理

 

 3.6 小结

图像压缩:imagecopyresampled

图片在指定范围内压缩:

1000*800   50*50 比例==20,宽的部分压缩的比例

800*1000      50*50     比例==20,高度部分压缩的比例

 

兼容主流的图像格式(i=mage/pngimage/jpegimage/gif

每个格式对应一个创建图像资源、保存图像资源的函数:

image/png  ------------à   imagecreatefrompng

....

先在构造函数中初始化文件类型、再通过mime类型找到对应的函数

 

解决背景透明:

$color = imagecolorallocate($image,255,255,255);

$color  = imagecolortransparent($image,$color);

  3.7 文件上传、图像压缩综合联系

 先上传文件,上传成功之后,将图像进行压缩处理

原文地址:https://www.cnblogs.com/qianjilou/p/6932863.html