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 相关文章推荐
深入了解php4(2)--重访过去
Oct 09 PHP
PHP常用代码
Nov 23 PHP
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
Mar 06 PHP
hadoop常见错误以及处理方法详解
Jun 19 PHP
解析PHP中常见的mongodb查询操作
Jun 20 PHP
php广告加载类用法实例
Sep 23 PHP
php获取YouTube视频信息的方法
Feb 11 PHP
php求数组全排列,元素所有组合的方法
May 05 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
Oct 25 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
Feb 08 PHP
php PDO判断连接是否可用的实现方法
Apr 03 PHP
php png失真的原因及解决办法
Oct 24 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去除数组中重复的元素并按键名排序函数
2008/08/18 PHP
调整优化您的LAMP应用程序的5种简单方法
2011/06/26 PHP
支持中文的php加密解密类代码
2011/11/27 PHP
php模拟服务器实现autoindex效果的方法
2015/03/10 PHP
php基于Snoopy解析网页html的方法
2015/07/09 PHP
PHP编程入门的基本语法知识点总结
2016/01/26 PHP
PHP实现的策略模式简单示例
2017/08/25 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
Mootools 1.2教程 类(一)
2009/09/15 Javascript
javascript的offset、client、scroll使用方法详解
2012/12/25 Javascript
可插入图片的TEXT文本框
2013/12/27 Javascript
Javascript简单改变表单元素背景的方法
2015/07/15 Javascript
Javascript类型转换的规则实例解析
2016/02/23 Javascript
javascript原型继承工作原理和实例详解
2016/04/07 Javascript
表单中单选框添加选项和移除选项
2016/07/04 Javascript
浅谈jquery之on()绑定事件和off()解除绑定事件
2016/10/26 Javascript
vue项目中用cdn优化的方法
2018/01/03 Javascript
node puppeteer(headless chrome)实现网站登录
2018/05/09 Javascript
Vue过渡效果之CSS过渡详解(结合transition,animation,animate.css)
2020/02/05 Javascript
[00:36]我的中国心——Serenity vs Fnatic
2018/08/21 DOTA
CentOS 7下安装Python 3.5并与Python2.7兼容并存详解
2017/07/07 Python
与Django结合利用模型对上传图片预测的实例详解
2019/08/07 Python
Python3 字典dictionary入门基础附实例
2020/02/10 Python
django xadmin中form_layout添加字段显示方式
2020/03/30 Python
纯CSS3制作漂亮带动画效果的主机价格表
2015/04/25 HTML / CSS
CSS3 rgb and rgba(透明色)的使用详解
2020/09/25 HTML / CSS
国际贸易专业个人求职信格式
2014/02/02 职场文书
师范教师专业大学生职业生涯规划范文
2014/03/02 职场文书
学校对教师的评语
2014/04/28 职场文书
禁止酒驾标语
2014/06/25 职场文书
团队拓展活动方案
2014/08/28 职场文书
关于晚自习早退的检讨书
2014/09/13 职场文书
2014年银行工作总结范文
2014/11/12 职场文书
领导干部失职检讨书
2015/05/05 职场文书
python中if和elif的区别介绍
2021/11/07 Python
什么是clearfix (一文搞清楚css清除浮动clearfix)
2023/05/21 HTML / CSS