php实现图片缩略图的方法


Posted in PHP onMarch 29, 2016

本段代码实现功能有这些:

支持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实现图片缩略图的方法,希望对大家有所帮助!

PHP 相关文章推荐
关于Intype一些小问题的解决办法
Mar 28 PHP
用PHP与XML联手进行网站编程代码实例
Jul 10 PHP
php学习笔记 面向对象中[接口]与[多态性]的应用
Jun 16 PHP
基于在生产环境中使用php性能测试工具xhprof的详解
Jun 03 PHP
PHP计算2点经纬度之间的距离代码
Aug 12 PHP
php下载文件源代码(强制任意文件格式下载)
May 09 PHP
PHP处理大量表单字段的便捷方法
Feb 07 PHP
php算法实例分享
Jul 14 PHP
PHP中读取文件的几个方法总结(推荐)
Jun 03 PHP
thinkphp5使用无限极分类
Feb 18 PHP
Yii框架视图、视图布局、视图数据块操作示例
Oct 14 PHP
PHP实现递归的三种方法
Jul 04 PHP
YII动态模型(动态表名)支持分析
Mar 29 #PHP
Yii操作数据库实现动态获取表名的方法
Mar 29 #PHP
Yii数据库缓存实例分析
Mar 29 #PHP
PHP+HTML+JavaScript+Css实现简单爬虫开发
Mar 28 #PHP
Yii框架上传图片用法总结
Mar 28 #PHP
Yii开启片段缓存的方法
Mar 28 #PHP
CI操作cookie的方法分析(基于helper类库)
Mar 28 #PHP
You might like
使用sockets:从新闻组中获取文章(三)
2006/10/09 PHP
PHP 获取文件路径(灵活应用__FILE__)
2013/02/15 PHP
php使用GD创建保持宽高比缩略图的方法
2015/04/17 PHP
laravel Task Scheduling(任务调度)在windows下的使用详解
2019/10/22 PHP
php封装的page分页类完整实例代码
2020/02/01 PHP
js文件中调用js的实现方法小结
2009/10/23 Javascript
Javascript 判断客户端浏览器类型代码
2010/03/01 Javascript
使用jQuery UI的tooltip函数修饰title属性的气泡悬浮框
2013/06/24 Javascript
Google Maps API地图应用示例分享
2014/10/23 Javascript
举例讲解AngularJS中的模块
2015/06/17 Javascript
Bootstrap入门书籍之(五)导航条、分页导航
2016/02/17 Javascript
微信小程序实现topBar底部选择栏效果
2018/07/20 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
2020/06/16 Javascript
vue 使用post/get 下载导出文件操作
2020/08/07 Javascript
[08:54]DOTA2-DPC中国联赛 正赛 Aster vs LBZS 选手采访
2021/03/11 DOTA
centos 下面安装python2.7 +pip +mysqld
2014/11/18 Python
python学习之编写查询ip程序
2016/02/27 Python
基于python的字节编译详解
2017/09/20 Python
Python找出最小的K个数实例代码
2018/01/04 Python
使用python爬虫获取黄金价格的核心代码
2018/06/13 Python
利用python循环创建多个文件的方法
2018/10/25 Python
Django REST framework 如何实现内置访问频率控制
2019/07/23 Python
Django DRF认证组件流程实现原理详解
2020/08/17 Python
python多线程爬取西刺代理的示例代码
2021/01/30 Python
python 多线程爬取壁纸网站的示例
2021/02/20 Python
将SVG图引入到HTML页面的实现
2019/09/20 HTML / CSS
态度决定一切演讲稿
2014/05/20 职场文书
三八活动策划方案
2014/08/17 职场文书
财务工作疏忽检讨书
2014/09/11 职场文书
戒赌保证书
2015/05/11 职场文书
幼儿园中班教学反思
2016/03/03 职场文书
教师师德承诺书2016
2016/03/25 职场文书
HR必备:销售经理聘用合同范本
2019/08/21 职场文书
利用 JavaScript 构建命令行应用
2021/11/17 Javascript
如何优化vue打包文件过大
2022/04/13 Vue.js