基于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 相关文章推荐
PHP与javascript的两种交互方式
Oct 09 PHP
php中防止恶意刷新页面的代码小结
Oct 31 PHP
php中3种方法删除字符串中间的空格
Mar 10 PHP
php数组键值用法实例分析
Feb 27 PHP
php使用Jpgraph绘制3D饼状图的方法
Jun 10 PHP
php实现过滤字符串中的中文和数字实例
Jul 29 PHP
Zend Framework基本页面布局分析
Mar 19 PHP
thinkPHP5.0框架应用请求生命周期分析
Mar 25 PHP
PHP性能分析工具xhprof的安装使用与注意事项
Dec 19 PHP
Laravel5.1 框架路由基础详解
Jan 04 PHP
PHP之header函数详解
Mar 02 PHP
phpquery中文手册
Mar 18 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如何搭建百度Ueditor富文本编辑器
2018/09/21 PHP
Laravel 队列使用的实现
2019/01/08 PHP
PDO::quote讲解
2019/01/29 PHP
Lazy Load 延迟加载图片的 jQuery 插件
2010/02/06 Javascript
JavaScript 类似flash效果的立体图片浏览器
2010/02/08 Javascript
《JavaScript高级程序设计》阅读笔记(二) ECMAScript中的原始类型
2012/02/27 Javascript
jquery中的$(document).ready()使用小结
2014/02/14 Javascript
原生js和jQuery随意改变div属性style的名称和值
2014/10/22 Javascript
AngularJS入门教程之Cookies读写操作示例
2016/11/02 Javascript
canvas红包照片实例分享
2017/02/28 Javascript
AngularJS中的路由使用及实现代码
2017/10/09 Javascript
Vue使用mixins实现压缩图片代码
2018/03/14 Javascript
用npm-run实现自动化任务的方法示例
2019/01/14 Javascript
微信小程序实现上传多个文件 超过10个
2020/03/30 Javascript
在Vue中使用antv的示例代码
2020/06/29 Javascript
Vue表单提交点击事件只允许点击一次的实例
2020/10/23 Javascript
[08:44]和酒神一起战斗 DOTA2教你做大人
2014/03/27 DOTA
[06:33]DOTA2亚洲邀请赛小组赛第二日 TOP10精彩集锦
2015/01/31 DOTA
Python实现短网址ShortUrl的Hash运算实例讲解
2015/08/10 Python
在Django同1个页面中的多表单处理详解
2017/01/25 Python
python如何生成各种随机分布图
2018/08/27 Python
对Python通过pypyodbc访问Access数据库的方法详解
2018/10/27 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
2018/12/15 Python
python通过实例讲解反射机制
2019/10/17 Python
Python调用shell命令常用方法(4种)
2020/05/11 Python
康帕斯酒店预订:Compass Hospitality(支持中文)
2018/08/23 全球购物
描述Cookie和Session的作用,区别和各自的应用范围,Session工作原理
2015/03/25 面试题
汽车工程专业应届生求职信
2013/10/19 职场文书
打架检讨书100字
2014/01/08 职场文书
真诚的求职信
2014/07/04 职场文书
国际商务专业求职信
2014/07/15 职场文书
2014年教师节演讲稿范文
2014/09/10 职场文书
2015年双拥工作总结
2015/04/08 职场文书
酒店开业主持词
2015/07/02 职场文书
springboot新建项目pom.xml文件第一行报错的解决
2022/01/18 Java/Android
「我的青春恋爱物语果然有问题。-妄言录-」第20卷封面公开
2022/03/21 日漫