shell脚本获取图像的收集像素大小

shell脚本获取图像的收集像素大小

我正在尝试创建返回总尺寸像素大小中最大图片的 shell 脚本?

例如:

我有超过 7000+ 个目录,每个目录都有图像:

dir_1/
picture_1.png = 800x600
picture_2.png = 80x100
picture_3.png = 80x640
picture_4.png = 500x630

dir_2/
p_1.png = 800x600
p_2.jpeg = 800x1000
p_3.png = 180x1640
p_4.gif = 500x30

所以预期的结果是:

 the largest one in dir_1 is: picture_1.png 
 the largest one is dir_2 is: p_2.png 

所以我想最好的方法是在收集数字后找出总尺寸..因此我尝试使用 sips 命令创建可以收集数字的 bash 脚本

这里的例子:

 for f in *;
 do
 far=$( cd $f/OEBPS/image/ | ls * | egrep 'jpg|png|jpeg')

 W=$( sips -g pixelWidth $far | cut -f 2 -d":" )
 H=$( sips -g pixelHeight $far | cut -f 2 -d":" )

 coll=$(expr $W + $H)
 echo $f total is: $coll
 cd -
 done

但结果出错。

有什么想法或更好的方法吗?

答案1

这是一种一步获得高度和宽度的方法:

IFS=x read w h < <(identify "$file" | grep -oP '\d+x\d+(?=\+)')

identify是 ImageMagick 包的一部分。

你的“$far”肯定不是你想要的:

for dir in */OEBPS/image/; do
    for image in "$dir"/*.{jpg,png,jpeg}; do
        IFS=x read w h < <(identify "$image" | grep -oP '\d+x\d+(?=\+)')
        echo $((w*h)) "$image"
    done | sort -n | tail -1 | {
        read size file
        echo "largest in $dir is $file"
    }
done

实际上,identify可以使用多个文件,因此更有效的技术:

for dir in */OEBPS/image/; do
    identify "$dir"/*.{jpg,png,jpeg} |
    awk '{split($(NF-6), a, /x/); split($0, b, /[[]/); print a[1]*a[2], b[1]}' |
    sort -n | tail -1 | {
        read size file
        echo "largest in $dir is $file"
    }
done

awk 命令有点复杂,因为我想处理可能包含空格的图像名称

答案2

#!/bin/bash
file=""
max=0
for f in /OEBPS/image/*{png,jpg,jpeg}
do
  id=$(identify "$f") 
  size=$(echo ${id} | sed -r 's/.* (JPEG|PNG) ([0-9]+)x([0-9]+) .*/\2*\3/')   
  area=$(($size))
  if (( area >= max ))
  then
    max=$area
    file="$f"
  fi
done
echo $max $file
  • 不要使用LS用于迭代脚本中的文件 - 文件名中的空格将阻止它们。
  • 光盘大约。
  • 我们不需要排序来按区域找到最大的文件。
  • 要在 bash 中进行算术运算,您不需要表达式,但是 $((a*b))。

确定需求图像魔术师

sed- 如果你的文件名看起来太接近输出,命令将会失败确认

相关内容