基于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新手上路(四)
Oct 09 PHP
目录,文件操作详谈―PHP
Nov 25 PHP
php之CodeIgniter学习笔记
Jun 17 PHP
小谈php正则提取图片地址
Mar 27 PHP
CI框架在CLI下执行占用内存过大问题的解决方法
Jun 17 PHP
浅析PHP中strlen和mb_strlen的区别
Aug 31 PHP
php+mysqli使用面向对象方式查询数据库实例
Jan 29 PHP
php中数据库连接方式pdo和mysqli对比分析
Feb 25 PHP
ThinkPHP数据操作方法总结
Sep 28 PHP
php json_encode与json_decode详解及实例
Dec 13 PHP
PHP三种方式实现链式操作详解
Jan 21 PHP
PHP/HTML混写的四种方式总结
Feb 27 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通过ajax实现双击table修改内容
2014/04/28 PHP
JavaScript arguments 多参传值函数
2010/10/24 Javascript
浅谈JavaScript字符集
2014/05/22 Javascript
js计算任意值之间随机数的方法
2015/01/16 Javascript
JS使用post提交的两种方式
2015/12/03 Javascript
深入浅出ES6新特性之函数默认参数和箭头函数
2016/08/01 Javascript
JavaScript 数据类型详解
2017/03/13 Javascript
javascript 中的继承实例详解
2017/05/05 Javascript
Angular中点击li标签实现更改颜色的核心代码
2017/12/08 Javascript
Node.js console控制台简单用法分析
2019/01/04 Javascript
详解JavaScript中的强制类型转换
2019/04/15 Javascript
js实现多张图片每隔一秒切换一张图片
2019/07/29 Javascript
vue通过video.js解决m3u8视频播放格式的方法
2019/07/30 Javascript
vue 根据选择条件显示指定参数的例子
2019/11/09 Javascript
vue中的过滤器及其时间格式化问题
2020/04/09 Javascript
openlayers4实现点动态扩散
2020/08/17 Javascript
[00:58]2016年国际邀请赛勇士令状宣传片
2016/06/01 DOTA
[01:14:30]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第二场 8.20.mp4
2019/08/22 DOTA
详解Python中列表和元祖的使用方法
2015/04/25 Python
Perl中著名的Schwartzian转换问题解决实现
2015/06/02 Python
Python下载网络文本数据到本地内存的四种实现方法示例
2018/02/05 Python
对Python Pexpect 模块的使用说明详解
2019/02/14 Python
解决jupyter notebook 前面书写后面内容消失的问题
2020/04/13 Python
python删除文件、清空目录的实现方法
2020/09/23 Python
Python tkinter实现日期选择器
2021/02/22 Python
Gap工厂店:Gap Factory
2017/11/02 全球购物
J2EE面试题大全
2016/08/06 面试题
初婚未育未抱养证明
2014/01/12 职场文书
表彰大会主持词
2014/03/26 职场文书
股东授权委托书范文
2014/09/13 职场文书
工作时间擅自离岗检讨书
2014/10/24 职场文书
2016年小学生迎国庆广播稿
2015/12/18 职场文书
python如何做代码性能分析
2021/04/26 Python
Python爬虫:从m3u8文件里提取小视频的正确操作
2021/05/14 Python
教你怎么用python selenium实现自动化测试
2021/05/27 Python
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
2022/04/13 Python