[散分]生活便利小代码,拍照后,批量递归缩放目录图片.
新入手单反一周了,今天终于找上了机会带上老婆老妈去荔枝公园拍了一天的照,回来准备上传至相册,突然发现,每张图片都有点偏大,找工具也很累,直接上网,东拼西凑了点代码.实现将指定目录的图片,按指定大小范围缩放并输出到指定目录(含递归) ,供自己以后处理相片使用. 不多废话了,附代码.
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 库代码.
<?php/** * 图片处理助手 */class imgHelper{ public $srcFiles; //源文件 array public $srcDirs; //源目录 public $exportDir; //输出目录 public $exportFiles; //输出文件 array private $_option = array("maxWidth"=>"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 < $maxWidth || $height < $maxHeight) return ; switch ($type) { case 1: $img = imagecreatefromgif($srcImage); break; case 2: $img = imagecreatefromjpeg($srcImage); break; case 3: $img = imagecreatefrompng($srcImage); break; } $scale = min($maxWidth/$width, $maxHeight/$height); //求出绽放比例 if($scale < 1) { $newWidth = floor($scale*$width); $newHeight = floor($scale*$height); $newImg = imagecreatetruecolor($newWidth, $newHeight); imagecopyresampled($newImg, $img, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height); $newName = ""; $toFile = preg_replace("/(.gif|.jpg|.jpeg|.png)/i","",$toFile); switch($type) { case 1: if(imagegif($newImg, "$toFile$newName.gif", $imgQuality)) return "$newName.gif"; break; case 2: if(imagejpeg($newImg, "$toFile$newName.jpg", $imgQuality)) return "$newName.jpg"; break; case 3: if(imagepng($newImg, "$toFile$newName.png", $imgQuality)) return "$newName.png"; break; default: if(imagejpeg($newImg, "$toFile$newName.jpg", $imgQuality)) return "$newName.jpg"; break; } imagedestroy($newImg); } imagedestroy($img); return false; } /** * 设置输出的大小 * @param string $width * @param string $height */ public function setOutputSize( $width = "1024" , $height = "768"){ $_option = array("maxWidth"=>"$width" , "maxHeight"=>"$height"); $this->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 "<fieldset style=\"-moz-border-radius:5px 5px 5px 5px; -moz-box-shadow:0px 0px 10px rgba(00,00,00,0.45); border: 3px solid transparent; padding:3px; margin-top:20px; \"><legend style=\"color: #069; margin:3px; $widthStr \">$title</legend>"; echo "<div style = '-moz-border-radius:10px 10px 10px 10px;font-size:14px; color:#069; border:1px solid #F0FAF9; font-size:9pt; background:#F0FAF9; padding:5px;'>"; print("<pre class="brush:php;toolbar:false">"); if ($type == 'json') { $array = json_decode($array); } print_r($array); print("
回复讨论(解决方案)
刚运行了一下,发现图片太多,运行时间不够,加一句 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 < $maxWidth || $height < $maxHeight) return ; switch ($type) { case 1: $img = imagecreatefromgif($srcImage); break; case 2: $img = imagecreatefromjpeg($srcImage); break; case 3: $img = imagecreatefrompng($srcImage); break; } $scale = min($maxWidth/$width, $maxHeight/$height); //求出绽放比例//...........
好建议,写得太随手,已修改!
$maxWidth = $this->_option["maxWidth"];
$maxHeight = $this->_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 < $maxWidth || $height < $maxHeight) return ; 我觉得有逻辑错误,你的打算是什么?
3.递归目录用RecursiveDirectoryIterator 会爽很多,手册(用户讨论版)上面就有很多例程,以你能写出这个类的……
不要纠结效率啥的,前提是生活便利
imagick 核心三行代码完成缩略图,问题是你可能正好没imagick环境呢,或者安装了版本不匹配呢,这一折腾,我转换都快完成啦
$image = new Imagick("mypicture.png");
$image->thumbnailImage(200, 150, true);
$image->writeImage("thumb.png");
前面是凑字的,可完全忽略
我主要的意思是,LZ,你能否先放出图呢?
自己用更加要快,代码漂亮反而是次要的
不纠结上不了#30啊,看来我应该把6点分开6层楼……
呵呵,大家期待放照呢
我是来看美女的
楼主快爆照
过来参合一下~
F5已碎
有分散都没人接?快点盖到30楼
速速上图
接分外加看美女照片 兄弟们雄起啊 就差两楼了
楼下的 兄弟们终于等到你了....
照片涅
代码真心不错,最重要的是服务生活的思想,太酷了!
貌似我是30楼啊!!
中奖了!
sorry,图片在家里的机器上,回家立马补上~
不是美女揍一顿
我只对相片感兴趣
人格担保,图片来自偷拍~
请问我是看中间这个美女的上面还是下面?
echo '先别急嘛,伯虎兄,你要知道美女这种东西,跟鲜花一样,需要有绿叶来衬托才会显出她的娇媚,你再看看嘛';
美女看了,代码收下了!!哈哈
确实是美女,不过美女是不是穿个山寨衣服呀。 “never cry” 少个“y”?
出去走走,放松心情。周末程序员们都去拍照吧~
好东西,收藏了,谢谢!
先 mark, 日后再说
确实是美女,不过美女是不是穿个山寨衣服呀。 “never cry” 少个“y”?
哈哈 这个 可以有
46楼真相
F5已碎 呵呵,笑死我了。。。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Alipay PHP ...

JWT는 주로 신분증 인증 및 정보 교환을 위해 당사자간에 정보를 안전하게 전송하는 데 사용되는 JSON을 기반으로 한 개방형 표준입니다. 1. JWT는 헤더, 페이로드 및 서명의 세 부분으로 구성됩니다. 2. JWT의 작업 원칙에는 세 가지 단계가 포함됩니다. JWT 생성, JWT 확인 및 Parsing Payload. 3. PHP에서 인증에 JWT를 사용하면 JWT를 생성하고 확인할 수 있으며 사용자 역할 및 권한 정보가 고급 사용에 포함될 수 있습니다. 4. 일반적인 오류에는 서명 검증 실패, 토큰 만료 및 대형 페이로드가 포함됩니다. 디버깅 기술에는 디버깅 도구 및 로깅 사용이 포함됩니다. 5. 성능 최적화 및 모범 사례에는 적절한 시그니처 알고리즘 사용, 타당성 기간 설정 합리적,

세션 납치는 다음 단계를 통해 달성 할 수 있습니다. 1. 세션 ID를 얻으십시오. 2. 세션 ID 사용, 3. 세션을 활성 상태로 유지하십시오. PHP에서 세션 납치를 방지하는 방법에는 다음이 포함됩니다. 1. 세션 _regenerate_id () 함수를 사용하여 세션 ID를 재생산합니다. 2. 데이터베이스를 통해 세션 데이터를 저장하십시오.

PHP 개발에서 견고한 원칙의 적용에는 다음이 포함됩니다. 1. 단일 책임 원칙 (SRP) : 각 클래스는 하나의 기능 만 담당합니다. 2. Open and Close Principle (OCP) : 변경은 수정보다는 확장을 통해 달성됩니다. 3. Lisch의 대체 원칙 (LSP) : 서브 클래스는 프로그램 정확도에 영향을 미치지 않고 기본 클래스를 대체 할 수 있습니다. 4. 인터페이스 격리 원리 (ISP) : 의존성 및 사용되지 않은 방법을 피하기 위해 세밀한 인터페이스를 사용하십시오. 5. 의존성 반전 원리 (DIP) : 높고 낮은 수준의 모듈은 추상화에 의존하며 종속성 주입을 통해 구현됩니다.

phpstorm에서 CLI 모드를 디버그하는 방법은 무엇입니까? PHPStorm으로 개발할 때 때때로 CLI (Command Line Interface) 모드에서 PHP를 디버그해야합니다 ...

PHP8.1의 열거 기능은 명명 된 상수를 정의하여 코드의 명확성과 유형 안전성을 향상시킵니다. 1) 열거는 정수, 문자열 또는 객체 일 수 있으며 코드 가독성 및 유형 안전성을 향상시킬 수 있습니다. 2) 열거는 클래스를 기반으로하며 Traversal 및 Reflection과 같은 객체 지향적 특징을 지원합니다. 3) 열거는 유형 안전을 보장하기 위해 비교 및 할당에 사용될 수 있습니다. 4) 열거는 복잡한 논리를 구현하는 방법을 추가하는 것을 지원합니다. 5) 엄격한 유형 확인 및 오류 처리는 일반적인 오류를 피할 수 있습니다. 6) 열거는 마법의 가치를 줄이고 유지 관리를 향상 시키지만 성능 최적화에주의를 기울입니다.

시스템이 다시 시작된 후 UnixSocket의 권한을 자동으로 설정하는 방법. 시스템이 다시 시작될 때마다 UnixSocket의 권한을 수정하려면 다음 명령을 실행해야합니다.

정적 바인딩 (정적 : :)는 PHP에서 늦은 정적 바인딩 (LSB)을 구현하여 클래스를 정의하는 대신 정적 컨텍스트에서 호출 클래스를 참조 할 수 있습니다. 1) 구문 분석 프로세스는 런타임에 수행됩니다. 2) 상속 관계에서 통화 클래스를 찾아보십시오. 3) 성능 오버 헤드를 가져올 수 있습니다.
