在所有超过特定分辨率的子目录中移动并替换每个图像。

4
我需要每天运行一个cron job,将所有宽度或高度超过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,我不确定如何移动这些图片并将原始文件名存储在 too_large.jpg 的 cp 中。我的目标是使用 Bash 完成此操作,但如果有人更喜欢 PHP,那么它也是一个选项。另一个烦人的要求是,原始文件类型需要保留,同时也存在相关的 too_large 文件。具体要求如下:
- 移动高度或宽度超过1000像素的图像,以匹配其中的任何一项。 - 将 too_large[.jpg/.png/.jpg] 复制到移动的图像位置。

1
在命中时,当前输出是什么样子? - Paul Hodges
啊,是的,我已经更新了问题并附上了输出。 - Jamie Hutber
3个回答

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

因此,循环只需读取和处理文件名。最初的回答。

while read -r file 中的 file 是如何知道包含 , 800 x 800 的字符串是文件名呢? - Jamie Hutber
1
你的 awk 已经选择了太大的文件。while 假定 awk 会删除那些大小适中的文件。 - Paul Hodges
啊!我太蠢了,抱歉我错过了奇怪的 print $1 - Jamie Hutber

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);

    }
}

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即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接