新入手单反一周了,今天终于找上了机会带上老婆老妈去荔枝公园拍了一天的照,回来准备上传至相册,突然发现,每张图片都有点偏大,找工具也很累,直接上网,东拼西凑了点代码.实现将指定目录的图片,按指定大小范围缩放并输出到指定目录(含递归) ,供自己以后处理相片使用. 不多废话了,附代码.
header('content-type:text/html; charset=utf-8'); require lib/imghelper.php; $imghelper = new imghelper( dir1 ); $imghelper->setoutputdir( dir2 ); //默认输出在1024 768 下等比缩放,需要自定义时,$imghelper->setoutputsize(1440,900); $imghelper->execution();
lib 库代码.
1024 , maxheight=>768); function __construct($dir = '' , $option = array() ) { if (!$dir) return; $this->srcdirs = $dir; $this->srcfiles = $this->traversal($dir); $this->setoptions( $option ); } /** * 设置输出目录 * @param $dir */ public function setoutputdir( $dir ) { if( !is_dir( $dir )) { mkdir($dir , 0777 , 1);} $this->exportdir = $dir; } public function execution() { foreach( $this->srcfiles as $key =>$val ): $srcimg = $val; $tofile = str_replace( $this->srcdirs , $this->exportdir , $srcimg); //todo 简便处理. $maxwidth = $this->_option[maxwidth]; $maxheight = $this->_option[maxheight]; $this->resize($srcimg , $tofile , $maxwidth , $maxheight ); endforeach; } //缩放图片. private function resize($srcimage,$tofile,$maxwidth = 100,$maxheight = 100,$imgquality=100) { //创建目录目录! $pinfo = pathinfo( $tofile ); $dir = $pinfo[dirname]; if(!is_dir( $dir) ){ mkdir($dir , 0777 , 1);} list($width, $height, $type, $attr) = getimagesize($srcimage); if($width setoptions( $_option ); } /** * 设置可选参数 * @param $option */ private function setoptions( $option) { foreach( $option as $key =>$val): if( isset( $option[$key]) && $option[$key] ){ $this->_option[$key] = $val; } endforeach; } /** * 遍得到文件夹下的所有文件 */ private function traversal($path) { if (!$path) return array(); $files = array(); if (!is_dir($path)) return; foreach (scandir($path) as $file) { if ($file != '.' && $file != '..') { $path2 = $path . '/' . $file; if (is_dir($path2)) { $temp = $this->traversal($path2); $files = array_merge($files, $temp); } else { if ($this->isimg($file)) { $files[] = $path . / . $file; } } } } return $files; } /** * 判断是否是图片 * @param $file * @return bool */ private function isimg($file) { $pinfo = pathinfo( $file); $extention = $pinfo[extension]; return preg_match(/(jpg)|(png)|gif/i , $extention); } /** * 调试数据 */ public function debug() {$this->pr($this->srcfiles, 待处理图片数组.); $this->pr( $this->srcdirs , 源目录); $this->pr( $this->exportdir , 目标目录); } private function pr($array, $title = 'debug', $type = 'array', $width = '') { /*** @格式化输出 */ $title .= date(y-m-d h:i:s); $widthstr = ; if ($width) $widthstr = width:$width . px; echo $title; echo ; print(); if ($type == 'json') { $array = json_decode($array); } print_r($array); print(
); echo ; echo ; }}
回复讨论(解决方案) 刚运行了一下,发现图片太多,运行时间不够,加一句 ini_set('max_execute_time',3600); 即可.
晕一个 上面的写错了,更正为 max_execution_time
代码没收了~~很好。
回帖超过30楼,送今日偷拍美女照片一张!
... ...
有点吗?有点嘛?有点啊?!
回帖超过30楼,送今日偷拍美女照片一张!
哈哈,类收起,....
$maxwidth = $this->_option[maxwidth];
$maxheight = $this->_option[maxheight];
放到循环外不是更好些?
resize 方法显得很臃肿
进来看看
这个不错,收藏一下,要用到
最近照了3k多张图片约20g图片,本以为程序写好后,就happy 的在运行转换了,谁知,当我当睡没多久,电脑遭遇老妈黑手,直接断电式关机.打开一看,只转了400张,再次运行,这400张图片将重复操作,于是折腾了一下代码,将重复去掉,并追加日志记录功能.
//在class imghelper 内.添加如下代码. private $copyoverwrite = true; private $islog = true; /** * 设置是否日志记录 * @param $bool */ public function setislog( $bool ) { $this->islog = $bool; } /** * 设置是否覆盖 * @param $bool */ public function setcopyoverwrite( $bool ){ $this->copyoverwrite = $bool; } //记录日志. private function log( $str ,$title = '图片助手日志' ) { $logfile =log/.date(y-m-d)..log; $pinfo = pathinfo( $logfile ); $dir = $pinfo[dirname]; if(!is_dir( $dir) ){ mkdir($dir , 0777 , 1);} $str = date(h:i:s).$str . \n; file_put_contents($logfile, $str,file_append); }
//对function resize() 进行修改//追加至首行. if( !$this->copyoverwrite && is_file($tofile)) //当设置为不覆盖,以及文件已存在时,跳过 { $this->log($tofile 已存在,且系统设置为不覆盖,将做跳过处理,操作提示); return ; } $this->log( 正在努力的生成 $tofile );//修改后 private function resize($srcimage,$tofile,$maxwidth = 100,$maxheight = 100,$imgquality=100) { if( !$this->copyoverwrite && is_file($tofile)) //当设置为不覆盖,以及文件已存在时,跳过 { $this->log($tofile 已存在,且系统设置为不覆盖,将做跳过处理,操作提示); return ; } $this->log( 正在努力的生成 $tofile ); //创建目录目录! $pinfo = pathinfo( $tofile ); $dir = $pinfo[dirname]; if(!is_dir( $dir) ){ mkdir($dir , 0777 , 1);} list($width, $height, $type, $attr) = getimagesize($srcimage); if($width _option[maxheight];
放到循环外不是更好些?
resize 方法显得很臃肿
public function execution() { $maxwidth = $this->_option[maxwidth]; $maxheight = $this->_option[maxheight]; foreach( $this->srcfiles as $key =>$val ): $srcimg = $val; $tofile = str_replace( $this->srcdirs , $this->exportdir , $srcimg); //todo 简便处理. $this->resize($srcimg , $tofile , $maxwidth , $maxheight ); endforeach; }
很不错~mark学习一下~
技术流改变生活....等楼主放美女照片
代码收藏了,原来楼主是在深圳工作
来深圳两年了,有空一起出来,聊天吹水.
代码收藏了,原来楼主是在深圳工作
1.看你echo html 标签,这是第一个问题,这个程序理应适合用命令行执行,而不是web方式
2. if($width < $maxwidth || $height < $maxheight) return ; 我觉得有逻辑错误,你的打算是什么?
3.递归目录用recursivedirectoryiterator 会爽很多,手册(用户讨论版)上面就有很多例程,以你能写出这个类的本领,看看应该例程不难掌握
4.resize的算法可以更加简单,再想想吧
5.图片很多的话建议用imagemagick而不是gd,效率更高
6.\n /换成php_eol和directory_separator常量吧,兼容一下win
最后的最后,大量图片还是用工具做缩放吧,专业软件效率高而且能控制输出的图片质量
但你的这个类修改后可以用在处理上传图片的后续处理,还是用处不小
resize 这个方法,直接来自互联网, 我并未关注里面的写法,这里也不愿意去较真,更多的是快速整合与实现!
1.看你echo html 标签,这是第一个问题,这个程序理应适合用命令行执行,而不是web方式
2. if($width writeimage(thumb.png);
前面是凑字的,可完全忽略
我主要的意思是,lz,你能否先放出图呢?
自己用更加要快,代码漂亮反而是次要的
不纠结上不了#30啊,看来我应该把6点分开6层楼……
呵呵,大家期待放照呢
我是来看美女的
楼主快爆照
过来参合一下~
f5已碎
有分散都没人接?快点盖到30楼
速速上图
接分外加看美女照片 兄弟们雄起啊 就差两楼了
楼下的 兄弟们终于等到你了....
照片涅
代码真心不错,最重要的是服务生活的思想,太酷了!
貌似我是30楼啊!!
中奖了!
sorry,图片在家里的机器上,回家立马补上~
不是美女揍一顿
我只对相片感兴趣
人格担保,图片来自偷拍~
请问我是看中间这个美女的上面还是下面?
echo '先别急嘛,伯虎兄,你要知道美女这种东西,跟鲜花一样,需要有绿叶来衬托才会显出她的娇媚,你再看看嘛';
美女看了,代码收下了!!哈哈
确实是美女,不过美女是不是穿个山寨衣服呀。 “never cry” 少个“y”?
出去走走,放松心情。周末程序员们都去拍照吧~
好东西,收藏了,谢谢!
先 mark, 日后再说
确实是美女,不过美女是不是穿个山寨衣服呀。 “never cry” 少个“y”?
哈哈 这个 可以有
46楼真相
f5已碎 呵呵,笑死我了。。。