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原理之错误抑制与内嵌HTML分析
May 02 PHP
PHP读取文件并可支持远程文件的代码分享
Oct 03 PHP
php删除与复制文件夹及其文件夹下所有文件的实现代码
Jan 23 PHP
PHP数组排序函数合集 以及它们之间的联系分析
Jun 27 PHP
php日历制作代码分享
Jan 20 PHP
PHP日期函数date格式化UNIX时间的方法
Mar 19 PHP
php实现QQ空间获取当前用户的用户名并生成图片
Jul 25 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
Jul 03 PHP
微信企业转账之入口类分装php代码
Oct 01 PHP
PHP addslashes()函数讲解
Feb 03 PHP
TP5.0框架实现无限极回复功能的方法分析
May 04 PHP
PHP实现笛卡尔积算法的实例讲解
Dec 22 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
set_exception_handler函数在ThinkPHP中的用法
2014/10/31 PHP
PHP程序员必须知道的两种日志实例分析
2020/05/14 PHP
如何解决Jquery库及其他库之间的$命名冲突
2013/09/15 Javascript
jquery1.10给新增元素绑定事件的方法
2014/03/06 Javascript
bootstrap data与jquery .data
2014/07/07 Javascript
node.js中的fs.readdirSync方法使用说明
2014/12/17 Javascript
详解JavaScript对Date对象的操作问题(生成一个倒数7天的数组)
2015/10/01 Javascript
js中对函数设置默认参数值的3种方法
2015/10/23 Javascript
三个js循环的关键字示例(for与while)
2016/02/16 Javascript
再次谈论React.js实现原生js拖拽效果引起的一系列问题
2016/04/03 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
2016/08/16 Javascript
js简单获取表单中单选按钮值的方法
2016/08/23 Javascript
十个免费的web前端开发工具详细整理
2017/09/18 Javascript
vue 中swiper的使用教程
2018/05/22 Javascript
vue2中使用sass并配置全局的sass样式变量的方法
2018/09/04 Javascript
vue实现的树形结构加多选框示例
2019/02/02 Javascript
小程序数据通信方法大全(推荐)
2019/04/15 Javascript
js实现查询商品案例
2020/07/22 Javascript
vue页面跳转实现页面缓存操作
2020/07/22 Javascript
逐行分析鸿蒙系统的 JavaScript 框架(推荐)
2020/09/17 Javascript
微信小程序实现电影App导航和轮播
2020/11/30 Javascript
Python中的特殊语法:filter、map、reduce、lambda介绍
2015/04/14 Python
python抽取指定url页面的title方法
2018/05/11 Python
python实现根据给定坐标点生成多边形mask的例子
2020/02/18 Python
Python如何使用vars返回对象的属性列表
2020/10/17 Python
Grow Gorgeous美国官网:只要八天,体验唤醒毛囊后新生的茂密秀发
2018/06/04 全球购物
澳大利亚珍珠首饰购物网站:Vayo Pearls
2019/03/11 全球购物
假日旅行社实习自我鉴定
2013/09/24 职场文书
商场中秋节活动方案
2014/02/07 职场文书
中学生操行评语
2014/04/24 职场文书
干部个人对照检查材料
2014/08/25 职场文书
2014年保管员工作总结
2014/11/18 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书
2015年学生资助工作总结
2015/05/25 职场文书
分析MySQL优化 index merge 后引起的死锁
2022/04/19 MySQL
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
2022/05/25 SQL Server