基于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+Html+缓存
Nov 25 PHP
浅析is_writable的php实现
Jun 18 PHP
PHP数据库操作之基于Mysqli的数据库操作类库
Apr 19 PHP
PHP邮件发送类PHPMailer用法实例详解
Sep 22 PHP
php实现的css文件背景图片下载器代码
Nov 11 PHP
ThinkPHP中自定义错误页面和提示页面实例
Nov 22 PHP
php中关于socket的系列函数总结
May 18 PHP
[原创]PHP正则删除html代码中a标签并保留标签内容的方法
May 23 PHP
利用php + Laravel如何实现部署自动化详解
Oct 11 PHP
Laravel源码解析之路由的使用和示例详解
Sep 27 PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
Dec 05 PHP
php计数排序算法的实现代码(附四个实例代码)
Mar 31 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
正则表达式语法
2006/10/09 Javascript
php mssql扩展SQL查询中文字段名解决方法
2012/10/15 PHP
PHP中copy on write写时复制机制介绍
2014/05/13 PHP
php自动识别文件编码并转换为UTF-8的方法
2014/06/12 PHP
PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析
2016/10/11 PHP
ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法
2018/09/26 PHP
国外Lightbox v2.03.3 最新版 下载
2007/10/17 Javascript
JavaScript 参数中的数组展开 [译]
2012/09/21 Javascript
js实现刷新iframe的方法汇总
2015/04/27 Javascript
js表单验证实例讲解
2016/03/31 Javascript
jQuery制作图片旋转效果
2017/02/02 Javascript
canvas实现图片根据滑块放大缩小效果
2017/02/24 Javascript
vue组件中点击按钮后修改输入框的状态实例代码
2017/04/14 Javascript
vue router路由嵌套不显示问题的解决方法
2017/06/17 Javascript
Validform验证时可以为空否则按照指定格式验证
2017/10/20 Javascript
Vue组件的使用教程详解
2018/01/05 Javascript
JS删除数组里的某个元素方法
2018/02/03 Javascript
JavaScript继承定义与用法实践分析
2018/05/28 Javascript
浅谈微信JS-SDK 微信分享接口开发(介绍版)
2018/08/15 Javascript
jquery层次选择器的介绍
2019/01/18 jQuery
JavaScript快速调试的两个技巧
2020/11/04 Javascript
详解Python自建logging模块
2018/01/29 Python
python版本的仿windows计划任务工具
2018/04/30 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
2018/12/11 Python
pytorch中的自定义数据处理详解
2020/01/06 Python
python 实现将Numpy数组保存为图像
2020/01/09 Python
基于Python绘制个人足迹地图
2020/06/01 Python
Python 保存加载mat格式文件的示例代码
2020/08/04 Python
海外淘书首选:AbeBooks
2017/07/31 全球购物
个人自我鉴定范文
2013/10/04 职场文书
学习十八大报告感言
2014/02/28 职场文书
幽默自我介绍演讲稿
2014/08/21 职场文书
党员十八大心得体会
2014/09/12 职场文书
2014向国旗敬礼网上签名活动总结
2014/09/27 职场文书
2014年煤矿工人工作总结
2014/12/08 职场文书
redis中lua脚本使用教程
2021/11/01 Redis