支持png透明图片的php生成缩略图类分享


Posted in PHP onFebruary 08, 2015

注:此功能依赖GD2图形库

最近要用php生成缩略图,在网上找了一下,发现了这篇文章:PHP生成图片缩略图

试用了一下后,发现有这样几个问题:

1、png图片生成的缩略图是jpg格式的

2、png图片生成的缩略图没有了透明(半透明)效果(填充了黑色背景)

3、代码语法比较老

因此,在这个版本的基础上简单修改优化了一下。

PHP生成缩略图类

<?php
  /*
   * desc: Resize Image(png, jpg, gif)
   * author: 十年后的卢哥哥
   * date: 2014.11.13
   */
  class ResizeImage {
    //图片类型
    private $type;
    //实际宽度
    private $width;
    //实际高度
    private $height;
    //改变后的宽度
    private $resize_width;
    //改变后的高度
    private $resize_height;
    //是否裁图
    private $cut;
    //源图象
    private $srcimg;
    //目标图象地址
    private $dstimg;
    //临时创建的图象
    private $im;

    function __construct($imgPath, $width, $height, $isCut, $savePath) {
      $this->srcimg = $imgPath;
      $this->resize_width = $width;
      $this->resize_height = $height;
      $this->cut = $isCut;
      //图片的类型

      $this->type = strtolower(substr(strrchr($this->srcimg,"."),1));

      //初始化图象
      $this->initi_img();
      //目标图象地址
      $this -> dst_img($savePath);
      //--
      $this->width = imagesx($this->im);
      $this->height = imagesy($this->im);
      //生成图象
      $this->newimg();
      ImageDestroy ($this->im);
    }

    private function newimg() {
      //改变后的图象的比例
      $resize_ratio = ($this->resize_width)/($this->resize_height);
      //实际图象的比例
      $ratio = ($this->width)/($this->height);
      if($this->cut) {
        //裁图
        $newimg = imagecreatetruecolor($this->resize_width,$this->resize_height);
        if($this->type=="png") {
          imagefill($newimg, 0, 0, imagecolorallocatealpha($newimg, 0, 0, 0, 127));
        }
        if($ratio>=$resize_ratio) {
          //高度优先
          imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, $this->resize_width,$this->resize_height, (($this->height)*$resize_ratio), $this->height);
        } else {
          //宽度优先
          imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, $this->resize_width, $this->resize_height, $this->width, (($this->width)/$resize_ratio));
        }
      } else {
        //不裁图
        if($ratio>=$resize_ratio) {
          $newimg = imagecreatetruecolor($this->resize_width,($this->resize_width)/$ratio);
          if($this->type=="png") {
            imagefill($newimg, 0, 0, imagecolorallocatealpha($newimg, 0, 0, 0, 127));
          }
          imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, $this->resize_width, ($this->resize_width)/$ratio, $this->width, $this->height);
        } else {
          $newimg = imagecreatetruecolor(($this->resize_height)*$ratio,$this->resize_height);
          if($this->type=="png") {
            imagefill($newimg, 0, 0, imagecolorallocatealpha($newimg, 0, 0, 0, 127));
          }
          imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, ($this->resize_height)*$ratio, $this->resize_height, $this->width, $this->height);
        }
      }
      if($this->type=="png") {
        imagesavealpha($newimg, true);
        imagepng ($newimg,$this->dstimg);
      } else {
        imagejpeg ($newimg,$this->dstimg);
      }
    }

    //初始化图象
    private function initi_img() {
      if($this->type=="jpg") {
        $this->im = imagecreatefromjpeg($this->srcimg);
      }
      if($this->type=="gif") {
        $this->im = imagecreatefromgif($this->srcimg);
      }
      if($this->type=="png") {
        $this->im = imagecreatefrompng($this->srcimg);
      }
    }

    //图象目标地址
    private function dst_img($dstpath) {
      $full_length = strlen($this->srcimg);

      $type_length = strlen($this->type);
      $name_length = $full_length-$type_length;


      $name     = substr($this->srcimg,0,$name_length-1);
      $this->dstimg = $dstpath;
    }
  }
?>

使用

使用时,直接调用类的构造函数即可,构造函数如下:

$resizeimage = new resizeimage($imgPath, $width, $height, $isCut, $savePath);

参数
$imgPath:原图片地址

$width:缩略图宽

$height:缩略图高

$isCut:是否裁剪,bool值

$savePath:缩略图地址(可以跟原图片地址相同)

示例

<?php
  include "ResizeImage.php";

  //jpg
  $jpgResize = new ResizeImage("img/test_1920_1200.jpg", 320, 240, false, "img/test_320_240.jpg");

  //png
  $pngResize = new ResizeImage("img/test_1024_746.png", 320, 240, false, "img/test_320_240.png");

?>

效果

支持png透明图片的php生成缩略图类分享支持png透明图片的php生成缩略图类分享

PHP 相关文章推荐
用PHP动态创建Flash动画
Oct 09 PHP
用PHP来写记数器(详细介绍)
Oct 09 PHP
php 前一天或后一天的日期
Jun 28 PHP
php模板中出现空行解决方法
Mar 08 PHP
php处理文件的小例子(解压缩,删除目录)
Feb 03 PHP
解析PHP对现有搜索引擎的调用
Jun 25 PHP
PHP添加Xdebug扩展的方法
Feb 12 PHP
destoon整合ucenter后注册页面不跳转的解决方法
Jun 21 PHP
十个PHP高级应用技巧果断收藏
Sep 25 PHP
PHP magento后台无法登录问题解决方法
Nov 24 PHP
PHP设计模式之原型模式定义与用法详解
Apr 03 PHP
Laravel框架实现文件上传的方法分析
Sep 29 PHP
基于GD2图形库的PHP生成图片缩略图类代码分享
Feb 08 #PHP
php中get_object_vars()方法用法实例
Feb 08 #PHP
php面向对象中static静态属性与方法的内存位置分析
Feb 08 #PHP
php面向对象中static静态属性和静态方法的调用
Feb 08 #PHP
php延迟静态绑定实例分析
Feb 08 #PHP
PHP调用Linux命令权限不足问题解决方法
Feb 07 #PHP
PHP处理大量表单字段的便捷方法
Feb 07 #PHP
You might like
用PHP生成html分页列表的代码
2007/03/18 PHP
PHP中使用gettext来支持多语言的方法
2011/05/02 PHP
PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
2016/03/21 PHP
基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能
2017/02/24 PHP
php 一维数组的循环遍历实现代码
2017/04/10 PHP
js中传递特殊字符(+,&amp;)的方法
2014/01/16 Javascript
JS使用JSON作为参数实例分析
2016/06/23 Javascript
js获取元素的偏移量offset简单方法(必看)
2017/07/05 Javascript
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
2017/08/10 Javascript
Canvas实现微信红包照片效果
2018/08/21 Javascript
CKeditor富文本编辑器使用技巧之添加自定义插件的方法
2019/06/14 Javascript
Vue数据驱动表单渲染,轻松搞定form表单
2019/07/19 Javascript
Vue中点击active并第一个默认选中功能的实现
2020/02/24 Javascript
用Python将IP地址在整型和字符串之间轻松转换
2017/03/22 Python
Python安装图文教程 Pycharm安装教程
2018/03/27 Python
Python3导入自定义模块的三种方法详解
2018/04/13 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
Python实现的简单计算器功能详解
2018/08/25 Python
Python中判断子串存在的性能比较及分析总结
2019/06/23 Python
python安装scipy的方法步骤
2019/06/26 Python
Flask框架学习笔记之消息提示与异常处理操作详解
2019/08/15 Python
Python中函数的返回值示例浅析
2019/08/28 Python
如何基于Python批量下载音乐
2019/11/11 Python
Python之——生成动态路由轨迹图的实例
2019/11/22 Python
Python3操作读写CSV文件使用包过程解析
2020/04/10 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
2020/04/29 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
2020/07/14 Python
获取CSDN文章内容并转换为markdown文本的python
2020/09/06 Python
详解CSS3中的box-sizing(content-box与border-box)
2019/04/19 HTML / CSS
西班牙第一的网上药房:PromoFarma.com
2017/04/17 全球购物
香港卓悦化妆品官网:BONJOUR
2017/09/21 全球购物
意大利在线大学图书馆:Libreria universitaria
2019/07/16 全球购物
给老婆大人的检讨书
2014/02/24 职场文书
行政管理专业求职信
2014/07/06 职场文书
供电工程专业求职信
2014/08/09 职场文书
2015毕业生简历自我评价
2015/03/02 职场文书