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 相关文章推荐
一个oracle+PHP的查询的例子
Oct 09 PHP
在字符串中把网址改成超级链接
Oct 09 PHP
php XMLWriter类的简单示例代码(RSS输出)
Sep 30 PHP
PHP类与对象中的private访问控制的疑问
Nov 01 PHP
微信公众平台天气预报功能开发
Jul 06 PHP
php生成PDF格式文件并且加密
Jun 22 PHP
php使用Imagick生成图片的方法
Jul 31 PHP
CI操作cookie的方法分析(基于helper类库)
Mar 28 PHP
php+ajax登录跳转登录实现思路
Jul 31 PHP
thinkPHP显示不出验证码的原因与解决方法分析
May 20 PHP
PHP判断一个变量是否为整数、正整数的方法示例
Sep 11 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
Nov 25 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中的四舍五入函数代码(floor函数、ceil函数、round与intval)
2014/07/14 PHP
基于PHP实现等比压缩图片大小
2016/03/04 PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
2019/04/03 PHP
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
2008/08/14 Javascript
JS分页效果示例
2013/10/11 Javascript
浅析XMLHttpRequest的缓存问题
2013/12/13 Javascript
Js实现双击鼠标自动滚动屏幕的示例代码
2013/12/14 Javascript
js关于字符长度限制的问题示例探讨
2014/01/24 Javascript
jquery删除数据记录时的弹出提示效果
2014/05/06 Javascript
jQuery判断当前点击的是第几个li的代码
2014/09/26 Javascript
js实现的动画导航菜单效果代码
2015/09/10 Javascript
jquery实现模拟百分比进度条渐变效果代码
2015/10/29 Javascript
jQuery手动点击实现图片轮播特效
2020/04/20 Javascript
javascript的正则匹配方法学习
2016/02/24 Javascript
Node.js的MongoDB驱动Mongoose基本使用教程
2016/03/01 Javascript
Angualrjs和bootstrap相结合实现数据表格table
2017/03/30 Javascript
详解vue项目打包后通过百度的BAE发布到网上的流程
2018/03/05 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
让 babel webpack vue 配置文件支持智能提示的方法
2019/06/22 Javascript
[02:14]完美“圣”典2016风云人物:xiao8专访
2016/12/01 DOTA
Django 前后台的数据传递的方法
2017/08/08 Python
浅谈Python中的私有变量
2018/02/28 Python
python导包的几种方法(自定义包的生成以及导入详解)
2019/07/15 Python
python向企业微信发送文字和图片消息的示例
2020/09/28 Python
简单几步用纯CSS3实现3D翻转效果
2019/01/17 HTML / CSS
node中使用shell脚本的方法步骤
2021/03/23 Javascript
大学生活学习的自我评价
2013/12/03 职场文书
运动会通讯稿50字
2014/01/30 职场文书
2014春晚主持词
2014/03/25 职场文书
活动总结模板
2014/05/09 职场文书
节约每一滴水演讲稿
2014/09/09 职场文书
党员四风问题对照检查材料思想汇报
2014/09/16 职场文书
带香烟到学校抽的检讨书
2014/09/25 职场文书
2015年元旦主持词结束语
2014/12/14 职场文书
师德承诺书
2015/01/20 职场文书
互联网创业商业模式以及赚钱法则有哪些?
2019/10/12 职场文书