基于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 压缩文件夹的类代码
Nov 05 PHP
PHP 配置open_basedir 让各虚拟站点独立运行
Nov 12 PHP
PHP管理内存函数 memory_get_usage()使用介绍
Sep 23 PHP
浅析php数据类型转换
Jan 09 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
Jul 01 PHP
ThinkPHP权限认证Auth实例详解
Jul 22 PHP
PHP使用glob函数遍历目录或文件夹的方法
Dec 16 PHP
为百度UE编辑器上传图片添加水印功能
Apr 16 PHP
php similar_text()函数的定义和用法
May 12 PHP
PHP Yaf框架的简单安装使用教程(推荐)
Jun 08 PHP
PHP编程中的Session阻塞问题与解决方法分析
Aug 07 PHP
php实现的中秋博饼游戏之绘制骰子图案功能示例
Nov 06 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
基于mysql的论坛(4)
2006/10/09 PHP
PHP数据缓存技术
2007/02/14 PHP
限制ckeditor上传图片文件大小的方法
2013/11/15 PHP
JavaScript游戏之是男人就下100层代码打包
2010/11/08 Javascript
javascript实现控制浏览器全屏
2015/03/30 Javascript
JS使用cookie实现DIV提示框只显示一次的方法
2015/11/05 Javascript
AngularJS上拉加载问题解决方法
2016/05/23 Javascript
jQuery事件绑定方法学习总结(推荐)
2016/11/21 Javascript
Bootstrap select下拉联动(jQuery cxselect)
2017/01/04 Javascript
浅谈Vue2.0父子组件间事件派发机制
2018/01/08 Javascript
vue-router两种模式区别及使用注意事项详解
2019/08/01 Javascript
Vuex实现数据增加和删除功能
2019/11/11 Javascript
详解Python的Django框架中的模版相关知识
2015/07/15 Python
python 将字符串转换成字典dict的各种方式总结
2018/03/23 Python
python解压TAR文件至指定文件夹的实例
2019/06/10 Python
Python格式化字符串f-string概览(小结)
2019/06/18 Python
Python创建数字列表的示例
2019/11/28 Python
pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
2020/01/02 Python
利用Python计算KS的实例详解
2020/03/03 Python
如何在Python3中使用telnetlib模块连接网络设备
2020/09/21 Python
HTML5中在title标题标签里设置小图标的方法
2020/06/23 HTML / CSS
Speedo美国:澳大利亚顶尖泳衣制造商
2016/08/03 全球购物
瑜伽国际:Yoga International
2018/04/18 全球购物
int *p=NULL和*p= NULL有什么区别
2014/10/23 面试题
C#里面如何判断一个Object是否是某种类型(如Boolean)?
2016/02/10 面试题
关于运动会的稿件
2014/02/02 职场文书
物理系毕业生自荐书范文
2014/02/22 职场文书
保护环境演讲稿
2014/05/10 职场文书
元旦联欢会策划方案
2014/06/11 职场文书
一年级语文下册复习计划
2015/01/17 职场文书
公司会议开幕词
2015/01/29 职场文书
任命书标准格式
2015/03/02 职场文书
2015年安全生产管理工作总结
2015/05/25 职场文书
python使用openpyxl库读写Excel表格的方法(增删改查操作)
2021/05/02 Python
uwsgi+nginx代理Django无法访问静态资源的解决
2021/05/10 Servers
深入解析NumPy中的Broadcasting广播机制
2021/05/30 Python