使用PHP生成图片的缩略图的方法


Posted in PHP onAugust 18, 2015

 功能:支持jpg,jpeg,gif,png,bmp图片格式,支持按原图片的比例进行缩放,可以选择在图片缩放的过程中是否需要对图片进行裁切,加入了图片质量控制,可以实现缩略图片质量最高化。完整类的代码如下:
 

<?php
/**
 * 功能:php生成缩略图片的类
 */
 class ResizeImage{
  public $type;//图片类型
  public $width;//实际宽度
  public $height;//实际高度
  public $resize_width;//改变后的宽度
  public $resize_height;//改变后的高度
  public $cut;//是否裁图
  public $srcimg;//源图象 
  public $dstimg;//目标图象地址
  public $im;//临时创建的图象
  public $quality;//图片质量
  function resizeimage($img,$wid,$hei,$c,$dstpath,$quality=100){
   $this->srcimg=$img;
   $this->resize_width=$wid;
   $this->resize_height=$hei;
   $this->cut=$c;
   $this->quality=$quality;
   $this->type=strtolower(substr(strrchr($this->srcimg,'.'),1));//图片的类型
   $this->initi_img();//初始化图象
   $this -> dst_img($dstpath);//目标图象地址
   @$this->width=imagesx($this->im);
   @$this->height=imagesy($this->im);
   $this->newimg();//生成图象
   @ImageDestroy($this->im);
  }
  function newimg(){
   $resize_ratio=($this->resize_width)/($this->resize_height);//改变后的图象的比例
   @$ratio=($this->width)/($this->height);//实际图象的比例
   if(($this->cut)=='1'){//裁图
    if($img_func==='imagepng'&&(str_replace('.','',PHP_VERSION)>=512)){ //针对php版本大于5.12参数变化后的处理情况
     $quality=9;
    }
    if($ratio>=$resize_ratio){//高度优先
     $newimg=imagecreatetruecolor($this->resize_width,$this->resize_height);
     imagecopyresampled($newimg,$this->im,0,0,0,0,$this->resize_width,$this->resize_height,(($this->height)*$resize_ratio),$this->height);
     imagejpeg($newimg,$this->dstimg,$this->quality);
    }
    if($ratio<$resize_ratio){//宽度优先
     $newimg=imagecreatetruecolor($this->resize_width,$this->resize_height);
     imagecopyresampled($newimg,$this->im,0,0,0,0,$this->resize_width,$this->resize_height,$this->width,(($this->width)/$resize_ratio));
     imagejpeg($newimg,$this->dstimg,$this->quality);
    }
   }else{//不裁图
    if($ratio>=$resize_ratio){
     $newimg=imagecreatetruecolor($this->resize_width,($this->resize_width)/$ratio);
     imagecopyresampled($newimg,$this->im,0,0,0,0,$this->resize_width,($this->resize_width)/$ratio,$this->width,$this->height);
     imagejpeg($newimg,$this->dstimg,$this->quality);
    }
    if($ratio<$resize_ratio){
     @$newimg=imagecreatetruecolor(($this->resize_height)*$ratio,$this->resize_height);
     @imagecopyresampled($newimg,$this->im,0,0,0,0,($this->resize_height)*$ratio,$this->resize_height,$this->width,$this->height);
     @imagejpeg($newimg,$this->dstimg,$this->quality);
    }
   }
  }
  function initi_img(){//初始化图象
   if($this->type=='jpg' || $this->type=='jpeg'){
    $this->im=imagecreatefromjpeg($this->srcimg);
   }
   if($this->type=='gif'){
    $this->im=imagecreatefromgif($this->srcimg);
   }
   if($this->type=='png'){
    $this->im=imagecreatefrompng($this->srcimg);
   }
   if($this->type=='wbm'){
    @$this->im=imagecreatefromwbmp($this->srcimg);
   }
   if($this->type=='bmp'){
    $this->im=$this->ImageCreateFromBMP($this->srcimg);
   }
  }
  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;
   //echo $this->dstimg;
  }
   
  function ImageCreateFromBMP($filename){ //自定义函数处理bmp图片
   if(!$f1=fopen($filename,"rb"))returnFALSE;
   $FILE=unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset",fread($f1,14));
   if($FILE['file_type']!=19778)returnFALSE;
   $BMP=unpack('Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel'.
     '/Vcompression/Vsize_bitmap/Vhoriz_resolution'.
     '/Vvert_resolution/Vcolors_used/Vcolors_important',fread($f1,40));
   $BMP['colors']=pow(2,$BMP['bits_per_pixel']);
   if($BMP['size_bitmap']==0)$BMP['size_bitmap']=$FILE['file_size']-$FILE['bitmap_offset'];
   $BMP['bytes_per_pixel']=$BMP['bits_per_pixel']/8;
   $BMP['bytes_per_pixel2']=ceil($BMP['bytes_per_pixel']);
   $BMP['decal']=($BMP['width']*$BMP['bytes_per_pixel']/4);
   $BMP['decal']-=floor($BMP['width']*$BMP['bytes_per_pixel']/4);
   $BMP['decal']=4-(4*$BMP['decal']);
   if($BMP['decal']==4)$BMP['decal']=0;
   $PALETTE=array();
   if($BMP['colors']<16777216)
   {
    $PALETTE=unpack('V'.$BMP['colors'],fread($f1,$BMP['colors']*4));
   }
   $IMG=fread($f1,$BMP['size_bitmap']);
   $VIDE=chr(0);
   $res=imagecreatetruecolor($BMP['width'],$BMP['height']);
   $P=0;
   $Y=$BMP['height']-1;
   while($Y>=0)
   {
    $X=0;
    while($X<$BMP['width'])
    {
     if($BMP['bits_per_pixel']==24)
      $COLOR=unpack("V",substr($IMG,$P,3).$VIDE);
     elseif($BMP['bits_per_pixel']==16)
     {
      $COLOR=unpack("n",substr($IMG,$P,2));
      $COLOR[1]=$PALETTE[$COLOR[1]+1];
     }
     elseif($BMP['bits_per_pixel']==8)
     {
      $COLOR=unpack("n",$VIDE.substr($IMG,$P,1));
      $COLOR[1]=$PALETTE[$COLOR[1]+1];
     }
     elseif($BMP['bits_per_pixel']==4)
     {
      $COLOR=unpack("n",$VIDE.substr($IMG,floor($P),1));
      if(($P*2)%2==0)$COLOR[1]=($COLOR[1]>>4);else$COLOR[1]=($COLOR[1]&0x0F);
      $COLOR[1]=$PALETTE[$COLOR[1]+1];
     }
     elseif($BMP['bits_per_pixel']==1)
     {
      $COLOR=unpack("n",$VIDE.substr($IMG,floor($P),1));
      if(($P*8)%8==0)$COLOR[1]=$COLOR[1]>>7;
      elseif(($P*8)%8==1)$COLOR[1]=($COLOR[1]&0x40)>>6;
      elseif(($P*8)%8==2)$COLOR[1]=($COLOR[1]&0x20)>>5;
      elseif(($P*8)%8==3)$COLOR[1]=($COLOR[1]&0x10)>>4;
      elseif(($P*8)%8==4)$COLOR[1]=($COLOR[1]&0x8)>>3;
      elseif(($P*8)%8==5)$COLOR[1]=($COLOR[1]&0x4)>>2;
      elseif(($P*8)%8==6)$COLOR[1]=($COLOR[1]&0x2)>>1;
      elseif(($P*8)%8==7)$COLOR[1]=($COLOR[1]&0x1);
      $COLOR[1]=$PALETTE[$COLOR[1]+1];
     }
     else
      returnFALSE;
     imagesetpixel($res,$X,$Y,$COLOR[1]);
     $X++;
     $P+=$BMP['bytes_per_pixel'];
    }
    $Y--;
    $P+=$BMP['decal'];
   }
   fclose($f1);
   return$res;
  }
   
 }
?>

使用方法很简单代码如下:

 

$resizeimage=new ResizeImage('upload/abc.bmp', '120', '90', '0', 'upload/xabc.bmp');


另外一个强大的PHP图片缩略图类:phpThumb

该类除了缩放图片外,还能将图片转换成不同的格式输出(比如将GIF格式的图片输出为PNG格式),其特色功能还包括色彩、特效等

官方网址:http://phpthumb.sourceforge.net/

    We'll be using phpThumb , the open source PHP script to generate thumbnails on the fly.

    Download and extract phpThumb to somewhere in your website folder. Now to use a rounded corner thumbnail of an image, simply use the img tag of HTML with src as

<img src=”phpThumb.php?src=test.jpg&w=200&h=150&fltr[]=ric|20|20&f=png” /> 

 Adjust the path to phpThumb according to where you place the phpThumb files.

 <html> 
 <head>
 </head> 
 <body> 
  <img src="phpThumb/phpThumb.php?src=../images/test.jpg&w=400&fltr[]=fram|3|2|CC9966|333333|CCCCCC" alt=""> 
 </body> 
 </html>

 

一般只需要下面的文件就可以了

其实phpThumb的功能比我原先想象的要强大一些,下面把他的其他一些有用的参数列一下:

src:目标图片的地址

w:输出图片的宽度

h:输出图片的高度(如果不指定他将按w参数等比缩放)

q:输出如果是JPG格式的,可以规定它的输出质量

bg:输出时的背景(如果需要)

sw、sh、sx、sy:局部输出,宽高、起始位置

f:输出格式,可以为jpeg、png、gif、ico

sfn:输出gif动画中的某一帧

fltr[]:滤镜,可以有很多效果,包括锐化、模糊、旋翻转、水印、边框、遮照、色彩调整等

使用演示:

 

//加载类库文件

 require_once 'path/to/ThumbLib.inc.php';

 //实例化类库,传入你要处理的图片的地址可以是网络地址,也可以是本地地址

 $thumb = PhpThumbFactory::create('http://www.shlongyingjixie.com/');

 //把图片等比缩小到最大宽度 100px或者最高100px,当只输入一个参数的时候,是限制最宽的尺寸。

 $thumb->resize(100, 100);

 //把图片等比缩小到原来的百分数,比如50就是原来的50%。

 $thumb->resizePercent(50);

 //截取一个175px * 175px的图片,注意这个是截取,超出的部分直接裁切掉,不是强制改变尺寸。
 $thumb->adaptiveResize(175, 175);

 //从图片的中心计算,截取200px * 100px的图片。

 $thumb->cropFromCenter(200, 100);

 //截图,前两个参数分别是需要解出的图片的右上角的坐标X,Y。 后面两个参数是需要解出的图片宽,高。

 $thumb->crop(100, 100, 300, 200);
 
 //把图片顺时针反转180度

 $thumb->rotateImageNDegrees(180);

 //保存(生成)图片,你可以保存其他格式,详细参考文档

 $thumb->save( 'NewPath/Of/image.jpg ' );
PHP 相关文章推荐
PHP开发框架总结收藏
Apr 24 PHP
那些年一起学习的PHP(一)
Mar 21 PHP
php安全之直接用$获取值而不$_GET 字符转义
Jun 03 PHP
yii框架通过控制台命令创建定时任务示例
Apr 30 PHP
PHP执行Curl时报错提示CURL ERROR: Recv failure: Connection reset by peer的解决方法
Jun 26 PHP
php常用hash加密函数
Nov 22 PHP
PHP实现抓取Google IP并自动修改hosts文件
Feb 12 PHP
PHP 芝麻信用接入的注意事项
Dec 01 PHP
Laravel使用支付宝进行支付的示例代码
Aug 16 PHP
Laravel利用gulp如何构建前端资源详解
Jun 03 PHP
laravel Task Scheduling(任务调度)在windows下的使用详解
Oct 22 PHP
PHP单元测试配置与使用方法详解
Dec 27 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
Aug 18 #PHP
详解PHP中的mb_detect_encoding函数使用方法
Aug 18 #PHP
深入讲解PHP Session及如何保持其不过期的方法
Aug 18 #PHP
php微信公众平台开发之获取用户基本信息
Aug 17 #PHP
PHP添加图片水印、压缩、剪切的封装类
Aug 17 #PHP
php中switch语句用法详解
Aug 17 #PHP
Linux系统下PHP-FPM的安装和配置教程
Aug 17 #PHP
You might like
使用数据库保存session的方法
2006/10/09 PHP
支持中文字母数字、自定义字体php验证码代码
2012/02/27 PHP
Zend Framework实现将session存储在memcache中的方法
2016/03/22 PHP
php获取客户端IP及URL的方法示例
2017/02/03 PHP
PHP设计模式之策略模式原理与用法实例分析
2019/04/04 PHP
window.open的功能全解析
2006/10/10 Javascript
javascript中的delete使用详解
2013/04/11 Javascript
JS模拟自动点击的简单实例
2013/08/08 Javascript
jquery中页面Ajax方法$.load的功能使用介绍
2014/10/20 Javascript
jquery动态添加文本并获取值的方法
2016/10/12 Javascript
JS实现的样式切换功能tableCSS实例
2016/12/30 Javascript
backbone简介_动力节点Java学院整理
2017/07/14 Javascript
Js利用console计算代码运行时间的方法示例
2017/09/24 Javascript
ES6 javascript中Class类继承用法实例详解
2017/10/30 Javascript
JS实现点击按钮可实现编辑功能
2018/07/03 Javascript
vue router的基本使用和配置教程
2018/11/05 Javascript
解决layui表格的表头不滚动的问题
2019/09/04 Javascript
Vue基于iview table展示图片实现点击放大
2020/08/05 Javascript
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
[01:03:51]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第三场
2018/04/09 DOTA
Python设计模式之装饰模式实例详解
2019/01/21 Python
python实现邮件发送功能
2019/08/10 Python
python 实现查询Neo4j多节点的多层关系
2019/12/23 Python
Python实现桌面翻译工具【新手必学】
2020/02/12 Python
python框架Django实战商城项目之工程搭建过程图文详解
2020/03/09 Python
Python3如何判断三角形的类型
2020/04/12 Python
Python填充任意颜色,不同算法时间差异分析说明
2020/05/16 Python
实例讲解CSS3中的border-radius属性
2015/08/18 HTML / CSS
初二政治教学反思
2014/01/12 职场文书
试用期转正员工自我评价
2014/09/18 职场文书
2014年档案管理工作总结
2014/11/17 职场文书
2014年公路养护工作总结
2014/12/04 职场文书
结婚纪念日感言
2015/08/01 职场文书
2016年第16个全民国防教育日宣传活动总结
2016/04/05 职场文书
nginx中proxy_pass各种用法详解
2021/11/07 Servers
分析Python list操作为什么会错误
2021/11/17 Python