画像の収集されたピクセルサイズを取得するシェルスクリプト

画像の収集されたピクセルサイズを取得するシェルスクリプト

合計ピクセルサイズのうち最大の画像を返すシェルスクリプトを生成しますか?

たとえば、

私はそれぞれ画像を含む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+(?=\+)')

identifyImageMagick パッケージの一部です。

あなたの「$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コマンドは、スペースを含む可能性があるイメージ名を処理する必要があるため、少し複雑です。

おすすめ記事