注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

早衰男的巢

大音希声 道隐无名

 
 
 

日志

 
 

php:处理缩略图  

2012-05-07 17:38:41|  分类: PHP |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一个线上管理图片的小模块,节选部分

1. 列出目录下全部的图片文件
img_manager.php

$imgdir = "./images";
$subpath = $_REQUEST['path']; //带参数的方式进入下级子目录

$files = scandir($imgdir.$subpath);
if($files){
foreach($files as $v){
if(is_dir($imgdir.$subpath."/".$v)){ //目录
//两个特殊的dir "." ".." 需要例外处理
if($v=="."){} //do nothing
elseif($v==".."){
//输出需要特殊
if($subpath){//当前不是图像根目录,处理方式是缩减路径
$cpos = strrpos($subpath,"/");
if($cpos){ //子目录层级>=2,向前缩进一级
echo "<div class=\"divThumb\"><a href='mana_images.php?path=".substr($subpath,0,$cpos)."'><img src=\"./images/dir.png\" /><br/>$v 【上一层】</a></div>";
}else{//一级子目录,直接砍至根目录
echo "<div class=\"divThumb\"><a href='mana_images.php'><img src=\"./images/dir.png\" /><br/>$v 『上一层』</a></div>";
}
}else{} //根目录不输出
}else //以下是普通文件夹的显示方式
echo "<div class=\"divThumb\"><a href='mana_images.php?path=".$subpath."/".$v."'><img src=\"./images/dir.png\" /><br/>$v</a></div>";


}else{ //显示缩略图。 thumb.php 是生成缩略图的程序,见下文
?><div class="divThumb">
<img src="thumb.php?file=<?php echo $imgdir.$subpath."/".$v."\" title='$v'";?>" />
<br/>
<!--// <?php echo $v;?><br /> -->
<a href="<?php echo $imgdir.$subpath."/".$v; ?>" target="_blank">预览</a> |
<a href="">删除</a>
</div>
<?php
}
}
}

*这里关于访问路径的遍历和父子级目录的进入返回操作,不算是特别的严谨。如果对文件保密有更严格要求的,注意处理$subpath 被注入的问题,过滤 “/../” 的重叠使用。

2. 加载缩略图
thumb.php

//限制只支持jpg,png,gif 三种格式,其余类型文件提示类型错误 (替代显示 400pic150.png 错误图片) //输出最大尺寸不超过150x150的缩略图
$img = $_GET['file']; //需要输出缩略图的地址

//调整php分配内存大小,避免出现处理图像的内存不足
//if(intval(ini_get('memory_limit')) <= 20){
//ini_set('memory_limit','20M');
//}

if(file_exists($img)&&is_file($img)){//生成缩略图
list($imgw, $imgh, $imgt, $attr) = getimagesize($img);
if($imgw>0&&$imgh>0){
//计算缩小的比例,目标最长边缩至150
$percent = $imgw>$imgh?(150/$imgw):(150/$imgh); //以最长边作为缩放参考
if($percent<1){ //计算缩略图的新尺寸
$new_width = floor($imgw*$percent);
$new_height = floor($imgh*$percent);
}else{ //如果原图尺寸小于 150x150 直接输出原图尺寸
$new_width = $imgw;
$new_height = $imgh;
}
$thumb = imagecreatetruecolor($new_width, $new_height); //创建缩略图对象
}

switch($imgt){ //判断格式,图像类型,但缩略图输出的都是jpg..参考下文
case 1:
$orgimg=imagecreatefromgif($img);
break;
case 2:
$orgimg=imagecreatefromjpeg($img);
break;
case 3:
$orgimg=imagecreatefrompng($img);
break;
default: //output 400 err 如果不是以上三种制定允许的格式,报错
header('Content-type: image/png');
$rec = file_get_contents("../images/400pic150.png"); //400 not a images
echo $rec;
die();
break;
}
header('Content-type: image/jpeg'); //指定header ,告诉浏览器输出的文件为jpg
imagecopyresampled($thumb, $orgimg, 0, 0, 0, 0, $new_width, $new_height, $imgw, $imgh); //缩放
imagejpeg($thumb,null,85); //output image

}else{ //没有找到这个文件,报错
header('Content-type: image/png');
$rec = file_get_contents("../images/404pic150.png"); //404 file
echo $rec;
}





试运行个别的图像无办法生成缩略图,查看log提示错误,原图尺寸太大,转换成image对象时内存不足
Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 5324 bytes) in  ……
用网上查到的办法,调整php可用内存(看上面默认是限了8M)

//这段写在处理图像之前,让php可以使用最大20M的内存

if(intval(ini_get('memory_limit')) <= 20){
ini_set('memory_limit','20M');
}

备忘如上。
  评论这张
 
阅读(1619)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018