はじめに
自分のスマートフォンはiphoneなのですが、写真の画像はHEICとかいうファイルで保存されてます。
このファイル形式自体はJPEGよりも圧縮効率が高く画質も良いという優れものです。
私事ですが少し前に車を購入し、ここ最近「みんから」という車用のSNSに投稿を始めました。
その際にHEICファイルが直接アップロードできないためにJPEGへ変換する必要が生じました。
ということで、今回はHEICをJPEGに変換するスクリプトを作成しました。
ソースコード
#!/bin/bash
#画像変換スクリプト
echo "HEICファイルの一覧を表示します"
ls *.HEIC
echo "HEICファイルの変換を行いますか?"
read answer
if [ "$answer" != "${answer#[Yy]}" ] ;then
echo "スクリプトを実行します"
else
echo "スクリプトの実行をキャンセルしました。"
exit
fi
for file in *.HEIC
do
sips --setProperty formatOptions 50 -s format jpeg "$file" --out "${file%.*}.jpg"
if [ $? -eq 0 ]; then
rm "$file"
else
echo "変換に失敗しました: $file"
fi
done
解説
フローとしては以下となります。
- 対象ファイルの確認を目的にカレントディレクトリの拡張性"HEIC"のファイルを一覧表示させます
- ファイル変換の実行判断を尋ねられるので、readコマンドで回答をインプットさせます
- answer変数(回答結果)を元に実施の有無を判定します
- for文でカレントディレクトリ内のHEICファイルの変換を逐次処理します
判定処理
readコマンドで判定用のパラーメタを入力することになるのですが、
この際に[yes]だったり、[y]だったり、大文字か小文字かなど様々な入力パターンがあるかと思います。
これらを論理和で記述していくのは中々辛いです。
ということで、少し工夫しbashの変数展開の前方一致除去を用いて手間を省きます。
ユーザが入力した文字列の先頭が Y もしくは y で始まる場合、その先頭一致した文字を削除します。
結果ユーザが入力したオリジナルのデータ(answer)との不一致が起こりますので、
これをTrue条件としてスクリプトを実行させます。
No や n などキャンセルを意図するような入力が行われた場合は、先頭文字が前方一致除去の条件に合致しないため何も除去されず結果if文はFalseで処理されるという訳です。
ここの一つ厄介な点としては、先頭がyから始まる適当な文字列でもTrueとして通過してしまう点ですね。
まぁこれは私的なスクリプトなため、このくらいの作り込みで手を引きます。
変換処理
sips は Mac でデフォルトで入っている画像編集用のコマンドです。
以下のようなコマンドのフォーマットとなります。
sips <オプション> <入力パス>
このコマンドは画像フォーマットの変換も行えるため、これを用いてJPEGへ変換をかけていきます。
JPEGは圧縮率(画質)を指定可能なので、formatOptionsで任意の値に変更します。
尚、値は0~100の範囲をとります。
ファイル出力時も変数展開を工夫して手間を省きます。
${file%.*}.jpg
このように書くことで、ファイル名から拡張子を除去し、新たにjpgの拡張子を追加した形で出力させます。
終わりに
個人的な目的のスクリプトだったので、今回そこまで作り込みをしませんでしたが、
さらに手間を加えれば汎用的な変換スクリプトとして使えるかも...