MacOSで、ディレクトリ内部の.heicファイルを一括で.jpgファイルに変換する方法

このエントリーは 今すぐalias登録すべきワンライナー by ゆめみ① Advent Calendar 2018 の16日目のエントリーです。

僕には愛する愛する4歳の娘が居まして、たった4年間ではありますが、iPhoneで何気なく撮影した彼女の成長を捉えた写真が数えきれないほどあります。

そして、それらの写真はこれからもどんどん増えますw。

それほど愛しい愛娘の写真でも、流石にローカルへずっと保存しておけるほどの量では無くなってきたので、いつでもどこでも見られて、間違って消してしまうことも無いGoogle Photoにあずけることにしました。

しばらくは問題なかったのですが、しかし、事件はおきました。

iPhoneやブラウザでカワイイ可愛い娘の写真を見る分には全く問題が無かったのですが、Google Photoから写真をダウンロードしてみると(今はまだ)扱いづらい画像ファイル、そう、 .HEIC ファイルとなっていることに気づきました。

.HEIC ファイル自体はまあ良いのですが、まだ未対応のアプリも多く非常に不便だったりします。

HEICファイルとは

High Efficiency Image File Format (ハイ・エフィシエンシー・イメージ・ファイル・フォーマット、HEIF、ヒーフ) は、Moving Picture Experts Group (MPEG) によって開発され、 MPEG-H Part 12 (ISO/IEC 23008-12) で定義された画像ファイルフォーマットである。1枚の画像やイメージシーケンスに使用される。HEIF方式による画像ファイルにはheifやheicといった拡張子が使われる。

2017年6月、アップルはmacOS High SierraiOS 11でHEIFをサポートすると発表し、その秋に出荷した。HEVCのサポートにより、静止画/動画の圧縮率は最大2倍にまで高められる[4]。

Wikipedia - High Efficiency Image File Format

結論

そこで、 .HEIC ファイルをJPEGファイルに変換する処理をワンライナーで作ってみました。

時代に逆行する内容で本当に申し訳ないと思っていますが、世のお父様方の代表として、ここに公開したいと思います。

$ find . -name '*.heic' | xargs -IT basename T .heic | xargs -IT sips --setProperty format jpeg ./T.heic --out ./T.jpg;
~/Downloads/IMG_8738.heic
  ~/Downloads/IMG_8738.jpg

簡単に説明しますと、

  • findでダウンロードした .HEIC ファイルを一覧する
  • xargs で一つづつ受けとり、basenameを利用して *.heic の拡張子を一度除外
  • さらに xargs で受けとり、sipsコマンドで変換

ただし・・・

xargs -IT basename T .heic

を挟むのがやや納得いきません。

何故やっているのかというと、もともとはこんなふうに書けばいいかなと思ったのに

$ find . -name '*.heic' | xargs -IT sips --setProperty format jpeg T --out ${T%.*}.jpg;
~/Downloads/IMG_8738.heic
  ~/Downloads/.jpg

xargs内では変数展開(下記の ${T%.*}.jpg )が出来ない?っぽく、ファイル名が空になってしまったからです。

例えば、これだったら変数展開でできるのですが・・・

$ for target in ./*.heic; do
>   sips --setProperty format jpeg $target --out ./${target%.*}.jpg;
> done
~/Downloads/IMG_8738.heic
  ~/Downloads/IMG_8738.jpg

でも、やっぱりワンライナーで書きたいですよね。

以上です。

ここまでお読みくださいまして、ありがとうございました。