支持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 相关文章推荐
php5 and xml示例
Nov 22 PHP
傻瓜化配置PHP环境――Appserv
Dec 13 PHP
php SQL Injection with MySQL
Feb 27 PHP
php中inlcude()性能对比详解
Sep 16 PHP
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
Jun 21 PHP
Laravel框架路由配置总结、设置技巧大全
Sep 03 PHP
php实现删除空目录的方法
Mar 16 PHP
php实现图片转换成ASCII码的方法
Apr 03 PHP
详解配置 Apache 服务器支持 PHP 文件的解析
Feb 15 PHP
在laravel中使用Symfony的Crawler组件分析HTML
Jun 19 PHP
原生php实现excel文件读写的方法分析
Apr 25 PHP
laravel5.5安装jwt-auth 生成token令牌的示例
Oct 24 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代码
2008/04/09 PHP
PHP使用PHPexcel导入导出数据的方法
2015/11/14 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
一些易混淆且不常用的属性,希望有用
2007/01/29 Javascript
js导入导出excel(实例代码)
2013/11/25 Javascript
jquery实现点击消失的代码
2014/03/03 Javascript
使用JavaScript 实现的人脸检测
2015/03/24 Javascript
使用jspdf生成pdf报表
2015/07/03 Javascript
jQuery插件之Tocify动态节点目录菜单生成器附源码下载
2016/01/08 Javascript
Jquery和angularjs获取check框选中的值的方法汇总
2016/01/17 Javascript
jQuery中的deferred使用方法
2017/03/27 jQuery
微信小程序 request接口的封装实例代码
2017/04/26 Javascript
详解使用vue脚手架工具搭建vue-webpack项目
2017/05/10 Javascript
探讨Vue.js的组件和模板
2017/10/27 Javascript
zTree 树插件实现全国五级地区点击后加载的示例
2018/02/05 Javascript
Js实现粘贴上传图片的原理及示例
2020/12/09 Javascript
[54:54]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
在Python下进行UDP网络编程的教程
2015/04/29 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
2017/07/13 Python
Scrapy爬虫实例讲解_校花网
2017/10/23 Python
用python制作游戏外挂
2018/01/04 Python
celery4+django2定时任务的实现代码
2018/12/23 Python
Python异常处理例题整理
2019/07/07 Python
python Opencv计算图像相似度过程解析
2019/12/03 Python
HTML5添加禁止缩放功能
2017/11/03 HTML / CSS
菲律宾旅游网站:Expedia菲律宾
2017/10/11 全球购物
有机童装:Toby Tiger
2018/05/23 全球购物
服装电子商务创业计划书
2014/01/30 职场文书
出国英文推荐信
2014/05/10 职场文书
爱护草坪标语
2014/06/24 职场文书
车间核算员岗位职责
2014/07/01 职场文书
上课玩手机的检讨书
2014/10/01 职场文书
领导干部作风整顿剖析材料
2014/10/11 职场文书
2014年优秀班主任工作总结
2014/12/16 职场文书
python实现web邮箱扫描的示例(附源码)
2021/03/30 Python
Redis可视化客户端小结
2021/06/10 Redis