基于PHP服务端图片生成缩略图的方法详解


Posted in PHP onJune 20, 2013
<?php
//定义缩略图片尺寸
$picSize = array(
              '100_100'=> 1,
              '200_100'=> 1
           );
$imagePath = "../image/";
function parseUrl($url){
   preg_match("/(?P<name>[\w\d]+)_w(?P<width>\d+)_h(?P<height>\d+)\.(?P<ext>\w+)/",$url,$match);
   return $match;
}
$urlArr = explode("/",$_SERVER['REQUEST_URI']);
$imgName = $urlArr[count($urlArr)-1];
$picInfo = parseUrl($imgName);
//错误尺寸
if(empty($picInfo['width']) || empty($picInfo['height']) ||
!array_key_exists($picInfo['width'].'_'.$picInfo['height'],$picSize)) die('不存在该尺寸图片');
$originalPic = $imagePath.$picInfo['name'].'/'.$picInfo['name'].'.'.$picInfo['ext'];
//原始图不存在
if(!file_exists($originalPic)) die("图片不存在!");
/**
 *等比例压缩图片
 */
switch($picInfo['ext']){
   case 'jpg':
      $orgImg = ImageCreateFromJpeg($originalPic);
      break;
   default: 
      break;
}
$owidth  =  ImageSX($orgImg); //原始尺寸
$oheight =  ImageSY($orgImg);
$tW = $picInfo['width'];
$tH = $picInfo['height'];
//获取缩略图尺寸
if($owidth/$oheight > $tW/$tH){
    $tH = intval($tW * $oheight/$owidth);
}else{
     $tW = intval($tH * $owidth/$oheight);
}
//生成背景图
$new_img = ImageCreateTrueColor($picInfo['width'], $picInfo['height']);
$bgColor = imagecolorallocate($new_img,255,255,255);
if (!@imagefilledrectangle($new_img, 0, 0, $picInfo['width']-1, $picInfo['height']-1, $bgColor)) {
    echo "无法创建背景图";  //@todo记录日志
    exit(0);
}
if (!@imagecopyresampled($new_img, $orgImg, ($picInfo['width']-$tW)/2, ($picInfo['height']-$tH)/2, 0, 0, $tW, $tH, $owidth, $oheight)) {
    echo "生成图片失败";
    exit(0);
}
//生成图片
ob_start();
imagejpeg($new_img);
$_newImg = ob_get_contents();
ob_end_clean();
file_put_contents($imagePath.$picInfo['name']."/".$imgName, $_newImg);
header("Content-type:image/jpeg; charset=utf-8");
imagejpeg($new_img);
?>

使用时候绑定apache conf 的 documentError 404 的handler 为此文件。。
PHP 相关文章推荐
PHP4实际应用经验篇(5)
Oct 09 PHP
frename PHP 灵活文件命名函数 frename
Sep 09 PHP
thinkphp验证码显示不出来的解决方法
Mar 29 PHP
thinkphp在模型中自动完成session赋值示例代码
Sep 09 PHP
php json_encode()函数返回json数据实例代码
Oct 10 PHP
php和editplus正则表达式去除空白行
Apr 17 PHP
php打造智能化的柱状图程序,用于报表等
Jun 19 PHP
Yii2中如何使用modal弹窗(基本使用)
May 30 PHP
购物车实现的几种方式优缺点对比
May 02 PHP
thinkPHP框架整合tcpdf插件操作示例
Aug 07 PHP
laravel实现按月或天或小时统计mysql数据的方法
Oct 09 PHP
PHP7移除的扩展和SAPI
Mar 09 PHP
解析thinkphp中的导入文件标签
Jun 20 #PHP
解析thinkphp import 文件内容变量失效的问题
Jun 20 #PHP
解析用PHP实现var_export的详细介绍
Jun 20 #PHP
PHP 实现explort() 功能的详解
Jun 20 #PHP
PHP 简易输出CSV表格文件的方法详解
Jun 20 #PHP
使用Linux五年积累的一些经验技巧
Jun 20 #PHP
解析PHP高效率写法(详解原因)
Jun 20 #PHP
You might like
如何在PHP程序中防止盗链
2008/04/09 PHP
PHP 源代码压缩小工具
2009/12/22 PHP
php递归删除指定文件夹的方法小结
2015/04/20 PHP
phpStudy访问速度慢和启动失败的解决办法
2015/11/19 PHP
php简单的上传类分享
2016/05/15 PHP
Fleaphp常见函数功能与用法示例
2016/11/15 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
2018/08/17 PHP
nodeType属性返回被选节点的节点类型介绍
2013/11/22 Javascript
JavaScript知识点总结之如何提高性能
2016/01/15 Javascript
JavaScript进阶练习及简单实例分析
2016/06/03 Javascript
Google 地图类型详解及示例代码
2016/08/06 Javascript
深入理解JavaScript中的并行处理
2016/09/22 Javascript
jquery-mobile基础属性与用法详解
2016/11/23 Javascript
AngularJS实现使用路由切换视图的方法
2017/01/24 Javascript
JS设计模式之观察者模式实现实时改变页面中金额数的方法
2018/02/05 Javascript
jQuery+Cookie实现切换皮肤功能【附源码下载】
2018/03/25 jQuery
微信小程序使用wxParse解析html的方法教程
2018/07/06 Javascript
vue监听键盘事件的快捷方法【推荐】
2018/07/11 Javascript
JavaScript中交换值的10种方法总结
2020/08/18 Javascript
python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
2014/06/09 Python
Python 序列化 pickle/cPickle模块使用介绍
2014/11/30 Python
python正常时间和unix时间戳相互转换的方法
2015/04/23 Python
详解Python中open()函数指定文件打开方式的用法
2016/06/04 Python
Python正则替换字符串函数re.sub用法示例
2017/01/19 Python
Python爬虫实例爬取网站搞笑段子
2017/11/08 Python
Python操作redis和mongoDB的方法
2019/12/19 Python
Python基于类路径字符串获取静态属性
2020/03/12 Python
Anconda环境下Vscode安装Python的方法详解
2020/03/29 Python
Selenium基于PIL实现拼接滚动截图
2020/04/10 Python
Python定时任务框架APScheduler原理及常用代码
2020/10/05 Python
欧舒丹俄罗斯官方网站:L’OCCITANE俄罗斯
2019/11/22 全球购物
飞利浦美国官网:Philips美国
2020/02/28 全球购物
车辆工程专业求职信
2014/04/28 职场文书
会计工作总结范文2014
2014/12/23 职场文书
伏羲庙导游词
2015/02/09 职场文书
教你如何使用Python Tkinter库制作记事本
2021/06/10 Python