我需要每天执行一次cron作业,以移动宽度或高度超过1000像素的所有图像,然后将移动的图像替换为默认图像,该图像位于运行此脚本的同一目录中。>
/gwart.co.uk/mediawiki/images/too_large.jpg //file used to replace old image
我能够使用以下方法过滤所有图像:
find -type f -regex "^.*\.\(png\|jpg\|jpeg\)$" -printf "%p, " -exec identify -format "%w, %h\n" {} \; | awk -F ',' '$2 > 1000 || $3 > 1000'
将会输出
./b1/Eldar_Guardian.png, 892, 1767
./b2/Farseer_with_Guardians1.png, 894, 1308
正在显示文件,但事实并非没有删除awk
,我不确定如何实际移动这些图像,然后将原始文件名存储到{{1 }}
我的目标是为此使用Bash,但是如果有人愿意,也许cp
也是一种选择。
另一个烦人的要求是原始文件类型需要保留,而且还存在相关的too_large.jpg
文件。
答案 0 :(得分:2)
假设您有详细信息,那么类似的东西-
find -type f -regex "^.*\.\(png\|jpg\|jpeg\)$" -printf "%p, " -exec identify -format "%w, %h\n" {} \; |
awk -F ',' '$2 > 1000 || $3 > 1000 {print $1}' |
while read -r file
do mv "$file" "some/other/place/$newName"
cp /gwart.co.uk/mediawiki/images/too_large.jpg "$file"
done
原始find
返回文件名和水平和垂直像素计数。
./b1/Eldar_Guardian.png, 892, 1767
./b2/Farseer_with_Guardians1.png, 894, 1308
您的awk
已经在选择超大文件;我只是添加了一个步骤,仅在找到文件名时才打印文件名。
awk -F ',' '$2 > 1000 || $3 > 1000 {print $1}' | # print of X or Y >1k
因此循环仅需读取和处理文件名。
答案 1 :(得分:1)
如果要使用PHP进行此伪代码,则应进行较小的调整。您将要确保您位于正确的目录(chdir)中,因为该示例假定您要检查的文件位于运行PHP的目录中。
$imagelist = glob('*.{png,jpg,jpeg}',GLOB_BRACE);
foreach ($imagelist as $image) {
$image_info = getimagesize($image);
if ($image_info[0] > 1000 OR
$image_info[1] > 1000) {
rename($image,'movebigfilelocation');
copy('/gwart.co.uk/mediawiki/images/too_large.jpg',$image);
}
}
答案 2 :(得分:1)
如果您具有PHP和Imagick,则还可以缩小图像尺寸。片段:
$maxXres = 1000;
$mimg = new \Imagick($img['tmp_name']);
$xresolution = $mimg->getImageWidth();
if ($xresolution > $this->maxXres){
$mimg->thumbnailImage($this->maxXres, 0);
}
$fn = "/where/ever/downscaled.jpg";
$mimg->writeImage($fn);
然后用$ fn覆盖原始文件。该示例仅考虑x轴,但是如何检查y侧是相同的,只是使用getImageHeight代替。