ろぐれこーど

限界組み込みエンジニアの学習記録とちょっぴりポエム

sipsコマンドでheic画像を別形式に一括変換する

.heicの画像をに別フォーマットに変換する必要があったため、シェルスクリプトを書きました。heic画像を格納したディレクトリで実行すれば同名のjpg画像を新たに保存します。macがサポートしているsipsコマンドを使用しているため、他OSでは使用できません。

for file in `ls *.heic`; do
  filename=${file%.*}
  sips --setProperty format jpeg $file --out ${filename}.jpg
done

formatにはtiff, png, gif, bmp等も指定できます。

補足説明あれこれ

sipsコマンド

scriptable image processing systemの略で、簡単な画像処理ならコマンドで実施できます。よく使いそうなコマンドは以下で大体紹介されています。

qiita.com

--getProperty (-g) 画像情報取得

画像情報の取得。sips -g <keys> <filename>と指定します。allをkeyに指定するとすべての情報が得られます。試しにallで取得すると以下のような結果が得られます。

hoge@MBP home $ sips -g all IMG_4070.heic

/Users/hoge/home/IMG_4070.heic
  pixelWidth: 4032
  pixelHeight: 3024
  typeIdentifier: public.heic
  format: heic
  formatOptions: default
  dpiWidth: 72.000
  dpiHeight: 72.000
  samplesPerPixel: 3
  bitsPerSample: 8
  hasAlpha: no
  space: RGB
  profile: Display P3
  creation: 2020:09:24 13:07:28
  make: Apple
  model: iPhone 8
  software: 13.7

撮影したデバイスiOSのバージョンまで取得できるのは意外です。上記の情報を個別にkeyに指定することもできます。

--setProperty (-s) 画像変換

冒頭のように画像フォーマットを変換したり、画像のメタ情報をセットしたりできます。ただし、撮影日時(creation)やiOSバージョン(software)などread-onlyな情報も存在します。

試しにmodelの情報をいじってみます。

hoge@MBP home % sips -s model iphone13 IMG_4070.heic
/Users/hoge/home/IMG_4070.heic
  /Users/hoge/home/IMG_4070.heic

hoge@MBP home % sips -g all IMG_4070.heic 
/Users/hoge/home/IMG_4070.heic
  pixelWidth: 4032
  pixelHeight: 3024
  typeIdentifier: public.heic
  format: heic
  formatOptions: default
  dpiWidth: 72.000
  dpiHeight: 72.000
  samplesPerPixel: 3
  bitsPerSample: 8
  hasAlpha: no
  space: RGB
  profile: Display P3
  creation: 2020:09:24 13:07:28
  make: Apple
  model: iphone13
  software: 13.7

無事(?)iphone13で撮影した画像ができました。

--out (-o) 別名で出力

出力ファイルを別名で保存します。指定しなければ上書きされます。

--cropToHeighWidth (-c) 切り出し

画像をクロップします。sips -c <pixelH> <pixelW> <filename>と指定しますが、元画像の中心を指定したサイズで切り出します。

-z アスペクト比を変えてリサイズ

sips -z <pixelH> <pixelW> <filename>でリサイズできます。アスペクト比は変わります。

-Z アスペクト比を維持してリサイズ

sips -Z <pixelWH> <filename>と指定します。アスペクト比を変えず、幅または高さが指定したサイズ以下になるようにリサイズします。

--flip (-f) 画像フリップ

sips -f horizontal <filename>で水平フリップ、sips -f vertical <filename> で垂直フリップができます。

代替手段

sipsコマンド以外では、ImageMagickを利用する方法があります。

imagemagick.org

Linux, Windows, Macだけでなく、iOSAndroidにもサポートされているフリーソフトです。多くの画像処理機能をサポートしており、heic画像の変換もできます。詳細は以下。

qiita.com

ただし、ImageMagickには多数の脆弱性が報告されているようです。個人で画像処理を行う分には問題はなさそうですが、アプリケーションに搭載するときには注意が必要そうです。

blog.cybozu.io

まとめ

heicを任意の形式に変換はできましたが、むしろiphoneで撮影したheic画像をpcに取り込むほうが大変ですね・・・mac OS Catalinaからは写真アプリ内のオリジナルの画像ファイルを取り出すのが難しくなったようです。

qiita.com

画像を大量に扱う場合はwindowsで頑張ってファイルコピーするか、クラウドストレージにちまちま移して別端末で取り出すか・・・。