基于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作为Shell脚本语言使用
Oct 09 PHP
重新封装zend_soap实现http连接安全认证的php代码
Jan 12 PHP
php记录日志的实现代码
Aug 08 PHP
div li的多行多列 无刷新分页示例代码
Oct 16 PHP
mac下Apache + MySql + PHP搭建网站开发环境
Jun 02 PHP
教你如何用php实现LOL数据远程获取
Jun 10 PHP
php获取一个变量的名字的方法
Sep 05 PHP
php一行代码获取文件后缀名实例分析
Nov 12 PHP
php批量删除操作(数据访问)
May 23 PHP
php获取数据库结果集方法(推荐)
Jun 01 PHP
PHP多进程之pcntl_fork的实例详解
Oct 15 PHP
laravel 实现设置时区的简单方法
Oct 10 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
收音机指标测试方法及仪器
2021/03/01 无线电
一些PHP写的小东西
2006/12/06 PHP
php面向对象全攻略 (五) 封装性
2009/09/30 PHP
php导出word格式数据的代码实例
2013/11/25 PHP
header导出Excel应用示例
2014/01/24 PHP
php进程间通讯实例分析
2016/07/11 PHP
自动刷新网页,自动刷新当前页面,JS调用
2013/06/24 Javascript
初始Nodejs
2014/11/08 NodeJs
jQuery简单实现两级下拉菜单效果代码
2015/09/15 Javascript
jQuery初级教程之网站品牌列表效果
2017/08/02 jQuery
使用vue构建移动应用实战代码
2017/08/02 Javascript
讲解vue-router之什么是动态路由
2018/05/28 Javascript
node.js中express模块创建服务器和http模块客户端发请求
2019/03/06 Javascript
利用js-cookie实现前端设置缓存数据定时失效
2019/06/18 Javascript
Element 默认勾选表格 toggleRowSelection的实现
2019/09/04 Javascript
微信小程序开发之获取用户手机号码(php接口解密)
2020/05/17 Javascript
基于react项目打包css引用路径错误解决方案
2020/10/28 Javascript
[09:13]DOTA2-DPC中国联赛 正赛 Ehome vs Magma 选手采访 1月19日
2021/03/11 DOTA
[01:25:38]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第一场 1月19日
2021/03/11 DOTA
python判断windows系统是32位还是64位的方法
2015/05/11 Python
讲解Python中的标识运算符
2015/05/14 Python
Windows环境下python环境安装使用图文教程
2018/03/13 Python
python奇偶行分开存储实现代码
2018/03/19 Python
Python基于FTP模块实现ftp文件上传操作示例
2018/04/23 Python
python保存数据到本地文件的方法
2018/06/23 Python
Python画图实现同一结点多个柱状图的示例
2019/07/07 Python
kafka监控获取指定topic的消息总量示例
2019/12/23 Python
员工培训心得体会
2013/12/30 职场文书
医院节能减排方案
2014/06/13 职场文书
酒店管理失职检讨书
2014/09/16 职场文书
雷峰塔导游词
2015/02/09 职场文书
遗失说明具结保证书
2015/02/26 职场文书
大客户经理岗位职责
2015/04/09 职场文书
运动会闭幕式致辞
2015/07/29 职场文书
python实现简单区块链结构
2021/04/25 Python
Axios取消重复请求的方法实例详解
2021/06/15 Javascript