PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】


Posted in PHP onDecember 08, 2018

本文实例总结了PHP图像处理技术。分享给大家供大家参考,具体如下:

1、绘图

场景: 验证码、图像水印、图像压缩处理

php绘图坐标体系是从0,0点越向右值越大,越向下值越大

需要开启php的gd2扩展 php.ini 中

参数1:图像资源(画布)
参数2:开始的x轴坐标
参数3:开始的y轴坐标
参数4:结束的x轴坐标
参数5:结束的y轴坐标
参数6:线条的颜色

(1)绘制线条: imageline($p1, $p2, $p3, $p4, $p5, $6)
(2)绘制三角形:imageline($p1, $p2, $p3, $p4, $p5, $6) // 需要3次
(3)绘制矩形:imagerectangle($p1, $p2, $p3, $p4, $p5, $6)
(3.1)绘制并填充矩形:imagefilledrectangle($p1, $p2, $p3, $p4, $p5, $6)
(4)绘制椭圆:imageellipse($p1, $p2, $p3, $p4, $p5, $6)
(4.1)绘制并填充椭圆:imagefilledellipse($p1, $p2, $p3, $p4, $p5, $6)

参数1:目标图像
参数2:原始图像
参数3:目标图像坐标x
参数4:目标图像坐标y
参数5:原始图像开始坐标x
参数6:原始图像开始坐标y
参数7:原始图像宽度
参数8:原始图像高度

(5)将图片绘制到画布上:imagecopy ( $p1, $p2, $p3, $p4, $p5, $6, $7, $8)

参数1:目标图像
参数2:字体 1,2,3,4 或 5,则使用内置字体
参数3:目标图像坐标x
参数4:目标图像坐标y
参数5:字符,文字
参数6:颜色

(6)绘制字符串:imagestring( $p1, $p2, $p3, $p4, $p5, $6)// 向画布写入字符,文字

参数1:图像资源
参数2:字体大小
参数3:倾斜角度
参数4:x轴坐标
参数5:y轴坐标
参数6:字体颜色
参数7:字体文件
参数8:文字

(7)绘制中文:imagettftext($p1, $p2, $p3, $p4, $p5, $6, $7, $8)

参数1:图像资源
参数2:弧形开始x坐标
参数3:弧形开始y坐标
参数4:弧形宽度
参数5:弧形高度
参数6:弧形开始角度
参数7:弧形结束角度
参数8:绘图颜色

(8)绘制弧形:imagearc($p1, $p2, $p3, $p4, $p5, $6, $7, $8) // 三点钟的位置是起点(0度), 顺时针方向绘画

实例 - 弧形

// 创建一个 200X200 的图像
$img = imagecreatetruecolor(200, 200);
// 分配颜色
$white = imagecolorallocate($img, 255, 255, 255);
$black = imagecolorallocate($img, 0, 0, 0);
// 画一个黑色的圆
imagearc($img, 100, 100, 150, 150, 0, 360, $black);
// 将图像输出到浏览器
header("Content-type: image/png");
imagepng($img);
// 释放内存
imagedestroy($img);

参数1:图像资源
参数2:弧形开始x坐标
参数3:弧形开始y坐标
参数4:弧形宽度
参数5:弧形高度
参数6:弧形开始角度
参数7:弧形结束角度
参数8:绘图颜色
参数9:填充样式

IMG_ARC_PIE : 用直线连接产生圆形边界
IMG_ARC_CHORD : 用直线连接了起始和结束点
IMG_ARC_NOFILL : 明弧或弦只有轮廓,不填充
IMG_ARC_EDGED :用直线将起始和结束点与中心点相连,和 IMG_ARC_NOFILL 一起使用是画饼状图轮廓的好方法(而不用填充)

(9)绘制弧形并填充:imagefilledarc($p1, $p2, $p3, $p4, $p5, $6, $7, $8, $9) // 三点钟的位置是起点(0度), 顺时针方向绘画

实例 - 弧形填充

// 创建图像
$image = imagecreatetruecolor(100, 100);
// 分配一些颜色
$white  = imagecolorallocate($image, 0xFF, 0xFF, 0xFF);
$gray   = imagecolorallocate($image, 0xC0, 0xC0, 0xC0);
$darkgray = imagecolorallocate($image, 0x90, 0x90, 0x90);
$navy   = imagecolorallocate($image, 0x00, 0x00, 0x80);
$darknavy = imagecolorallocate($image, 0x00, 0x00, 0x50);
$red   = imagecolorallocate($image, 0xFF, 0x00, 0x00);
$darkred = imagecolorallocate($image, 0x90, 0x00, 0x00);
// 创建 3D 效果
for ($i = 60; $i > 50; $i--) {
  imagefilledarc($image, 50, $i, 100, 50, 0, 45, $darknavy, IMG_ARC_PIE);
  imagefilledarc($image, 50, $i, 100, 50, 45, 75 , $darkgray, IMG_ARC_PIE);
  imagefilledarc($image, 50, $i, 100, 50, 75, 360 , $darkred, IMG_ARC_PIE);
}
imagefilledarc($image, 50, 50, 100, 50, 0, 45, $navy, IMG_ARC_PIE);
imagefilledarc($image, 50, 50, 100, 50, 45, 75 , $gray, IMG_ARC_PIE);
imagefilledarc($image, 50, 50, 100, 50, 75, 360 , $red, IMG_ARC_PIE);
// 输出图像
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);

效果

PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】

2、水印

使用 imagestring() 或者 imagettftext()

实例 - 图片加字

// 建立一幅 100X30 的图像
$im = imagecreate(100, 30);
// 白色背景和蓝色文本
$bg = imagecolorallocate($im, 255, 255, 255);
$textcolor = imagecolorallocate($im, 0, 0, 255);
// 把字符串写在图像左上角
imagestring($im, 5, 0, 0, "Hello world!", $textcolor);
// 输出图像
header("Content-type: image/png");
imagepng($im);

3、验证码

封装的验证码类

<?php
/*
 * 生成验证码
 */
class Captcha
{
  private $_width = 100;
  private $_height = 25;
  private $_number = 4; //显示的验证码的字符个数
  private $_font  = 15; //验证码字体大小
  private $_fontfile = 'STXINWEI.TTF';
  //创建验证码图像
  public function makeImage()
  {
    # 1. 创建图像资源(画布)
    $image = imagecreatetruecolor($this->_width,$this->_height);
    //随机填充颜色
    //mt_rand(0,255)  生成一个更具有唯一性的随机数 #000  255
    $color = imagecolorallocate($image,mt_rand(100,255),mt_rand(100,255),mt_rand(100,255));
    imagefill($image,0,0,$color);
    # 2.绘制文字
    $code = $this -> makeCode();  //随机生成验证码文字 ab3g
    $color = imagecolorallocate($image,mt_rand(0,100),mt_rand(0,100),mt_rand(0,100));
    for($i=0;$i<$this->_number;$i++){
      imagettftext($image,$this->_font,mt_rand(-30,30),$i*($this->_width/$this->_number)+5,20,$color,$this->_fontfile,$code[$i]);
    }
    # 3.绘制15条干扰线条
    for($i=0;$i<10;$i++){
      $color = imagecolorallocate($image,mt_rand(100,150),mt_rand(100,150),mt_rand(100,150));
      imageline($image,mt_rand(0,$this->_width),mt_rand(0,$this->_height),mt_rand(0,$this->_width),mt_rand(0,$this->_height),$color);
    }
    # 4.设置100个干扰像素点
    for($i=0;$i<100;$i++){
      imagesetpixel($image,mt_rand(0,$this->_width),mt_rand(0,$this->_height),$color);
    }
    # 5.将验证码保存起来吗,便于后面再其他地方使用
    //只能使用session来存储,session明天就会讲到
    session_start();
    $_SESSION['captcha'] = $code;
    //在浏览器输出、显示一下
    header("Content-Type:image/png");
    imagepng($image);
    imagedestroy($image);
  }
  /**
   * 随机产生随机数
   */
  public function makeCode()
  {
    # 获得字母的范围(大写字母、小写字母)
    $lower = range('a','z'); //创建从小a到小z字符范围的数组
    $upper = range('A','Z'); //创建从大A到大Z范围的数组
    $number = range(3,9);   //创建从3到9之间的数字
    //将上面的三个数组合并成一个数组
    $code  = array_merge($lower,$upper,$number);
    # 打乱数组元素的顺序
    shuffle($code);
    //随机从上面的数组中筛选出n个字符,需要通过下标来取数组的元素
    $str = '';
    for($i=0;$i<$this->_number;$i++){
      $str .= $code[$i];
    }
    return $str;
  }
  /**
   * 验证用户输入的验证码和我们生产的验证码是否一致
   * @param [str] $input [输入验证码值]
   * @return
   */
  public function checkCode($input)
  {
    session_start();
    if(strtolower($code) == strtolower($_SESSION['captcha'])){
      //说明验证码正确
      //echo '验证码正确';
      return true;
    }else{
      //echo '验证码错误';
      return false;
    }
  }
}
?>

实例 - 验证码验证(结合上面的验证类)

html页面

<form action="captcha.php?act=verify" method="post">
  验证码:<input type="text" name="captcha">
  <img src="captcha.php?act=show">
  <br>
  <input type="submit" value="提交">
</form>

验证码检测 captcha.php 页面

//接收地址栏上面的参数
  if($_GET['act']=='verify'){
    //说明是提交的表单
    //接收表单中用户输入的内容
    $code = $_POST['captcha'];
    //和创建的验证码进行比较
    session_start();
    //将用户输入的验证码 和 我们创建的统一小写之后再进行比较
    if(strtolower($code) == strtolower($_SESSION['captcha'])){
      //说明验证码正确
      echo '验证码正确';
    }else{
      echo '验证码错误';
    }
  }else if($_GET['act']=='show'){
    //说明需要显示一个图片
    require 'Captcha.class.php';
    $captcha = new Captcha();
    $captcha -> makeImage();
  }

4、图像压缩

对图像进行压

缩处理非常简单,因为就一个函数

参数1:目标图像资源(画布)
参数2:等待压缩图像资源
参数3:目标点的x坐标
参数4:目标点的y坐标
参数5:原图的x坐标
参数6:原图的y坐标
参数7:目的地宽度(画布宽)
参数8:目的地高度(画布高)
参数9:原图宽度
参数10:原图高度

imagecopyresampled($1,$2,$3,$4,$5,$6,$7,$8,$9,$10)

封装的图像压缩类

<?php
/*
 * 图像压缩处理类
 */
class Thumb
{
  private $_filename;    //等待压缩的图像
  private $_thumb_path = 'thumb/';  //压缩图像的保存目录
  public function __set($p,$v)
  {
    if(property_exists($this,$p)){
      $this -> $p = $v;
    }
  }
  //构造方法初始化需要压缩的图像
  public function __construct($file)
  {
    if(!file_exists($file)){
      echo '文件有误,不能压缩';
      return;
    }
    $this -> _filename = $file;
  }
  //图像压缩处理
  function makeThumb($area_w,$area_h)
  {
    $src_image = imagecreatefrompng($this->_filename);
    $res = getimagesize($this->_filename);
    echo '<pre>';
    var_dump($res);
    die;
    $dst_x = 0;
    $dst_y = 0;
    $src_x = 0;
    $src_y = 0;
    //原图的宽度、高度
    $src_w = imagesx($src_image);  //获得图像资源的宽度
    $src_h = imagesy($src_image);  //获得图像资源的高度
    if($src_w / $area_w < $src_h/$area_h){
      $scale = $src_h/$area_h;
    }
    if($src_w / $area_w >= $src_h/$area_h){
      $scale = $src_w / $area_w;
    }
    $dst_w = (int)($src_w / $scale);
    $dst_h = (int)($src_h / $scale);
    $dst_image = imagecreatetruecolor($dst_w,$dst_h);
    $color = imagecolorallocate($dst_image,255,255,255);
    //将白色设置为透明色
    imagecolortransparent($dst_image,$color);
    imagefill($dst_image,0,0,$color);
    imagecopyresampled($dst_image,$src_image,$dst_x,$dst_y,$src_x,$src_y,$dst_w,$dst_h,$src_w,$src_h);
    //可以在浏览器直接显示
    //header("Content-Type:image/png");
    //imagepng($dst_image);
    //分目录保存压缩的图像
    $sub_path = date('Ymd').'/';
    //规范:上传的图像保存到upload目录,压缩的图像保存到thumb目录
    if(!is_dir($this -> _thumb_path . $sub_path)){
      mkdir($this -> _thumb_path . $sub_path,0777,true);
    }
    $filename = $this -> _thumb_path . $sub_path.'thumb_'.$this->_filename;
    //也可以另存为一个新的图像
    imagepng($dst_image,$filename);
    return $filename;
  }
}
$thumb = new Thumb('upload.jpg');
$thumb -> _thumb_path = 'static/thumb/';
$file = $thumb -> makeThumb(100,50);
// var_dump($file);

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP.MVC的模板标签系统(二)
Sep 05 PHP
解析用PHP实现var_export的详细介绍
Jun 20 PHP
PHP时间格式控制符对照表分享
Jul 23 PHP
怎么在Windows系统中搭建php环境
Aug 31 PHP
Destoon模板制作简明教程
Jun 20 PHP
php解析json数据实例
Aug 19 PHP
PHP中round()函数对浮点数进行四舍五入的方法
Nov 19 PHP
php实现上传图片保存到数据库的方法
Feb 11 PHP
codeigniter发送邮件并打印调试信息的方法
Mar 21 PHP
yii2控制器Controller Ajax操作示例
Jul 23 PHP
PHP程序员学习使用Swoole的理由
Jun 24 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
Nov 14 PHP
Laravel框架定时任务2种实现方式示例
Dec 08 #PHP
PHP单例模式模拟Java Bean实现方法示例
Dec 07 #PHP
thinkPHP框架实现的简单计算器示例
Dec 07 #PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
Dec 07 #PHP
laravel5使用freetds连接sql server的方法
Dec 07 #PHP
php多进程模拟并发事务产生的问题小结
Dec 07 #PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
Dec 07 #PHP
You might like
在PHP中使用curl_init函数的说明
2010/11/02 PHP
php递归创建和删除文件夹的代码小结
2012/04/13 PHP
文本链接逐个出现的js脚本
2007/12/12 Javascript
appendChild() 或 insertBefore()使用与区别介绍
2013/10/11 Javascript
JavaScript+canvas实现七色板效果实例
2016/02/18 Javascript
javascript实现数字倒计时特效
2016/03/30 Javascript
jquery实现上传文件大小类型的验证例子(推荐)
2016/06/25 Javascript
JS实现用户注册时获取短信验证码和倒计时功能
2016/10/27 Javascript
详解使用React全家桶搭建一个后台管理系统
2017/11/04 Javascript
JS实现点击下拉菜单把选择的内容同步到input输入框内的实例
2018/01/23 Javascript
React BootStrap用户体验框架快速上手
2018/03/06 Javascript
在vue组件中使用axios的方法
2018/03/16 Javascript
[48:20]OpTic vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python自动化测试之连接几组测试包实例
2014/09/28 Python
在Django的通用视图中处理Context的方法
2015/07/21 Python
浅谈python中的正则表达式(re模块)
2017/10/17 Python
python print 按逗号或空格分隔的方法
2018/05/02 Python
Python3自动签到 定时任务 判断节假日的实例
2018/11/13 Python
python批量下载网站马拉松照片的完整步骤
2018/12/05 Python
Django使用中间键实现csrf认证详解
2019/07/22 Python
python3.x提取中文的正则表达式示例代码
2019/07/23 Python
Django用户认证系统 组与权限解析
2019/08/02 Python
python反转列表的三种方式解析
2019/11/08 Python
python 匿名函数与三元运算学习笔记
2020/10/23 Python
Python获取android设备cpu和内存占用情况
2020/11/15 Python
全面总结使用CSS实现水平垂直居中效果的方法
2016/03/10 HTML / CSS
Html5之svg可缩放矢量图形_动力节点Java学院整理
2017/07/17 HTML / CSS
HTML5 CSS3新的WEB标准和浏览器支持
2009/07/16 HTML / CSS
世界上最具创新性的增强型知名运动品牌:Proviz
2018/04/03 全球购物
澳大利亚当地社区首选的光学商店:1001 Optical
2019/08/24 全球购物
环境工程大学生个人的自我评价
2013/10/08 职场文书
童装店创业计划书
2014/01/09 职场文书
初中生庆国庆演讲稿范文2014
2014/09/25 职场文书
忠诚与背叛观后感
2015/06/04 职场文书
TV动画《史上最强大魔王转生为村民A》番宣CM公布
2022/04/01 日漫
Python通用验证码识别OCR库ddddocr的安装使用教程
2022/07/07 Python