今回はsipsコマンドでHEIFからJPEG形式などに画像形式を変換してみます。今回も処理する画像データなとはデスクトップのsampleフォルダです。cd ~/Desktop/sampleとしてカレントディレクトリを移動しておきましょう。もちろん、GUIを使用しない、できない環境や他のディレクトリがよい場合には、状況に応じて処理する画像ファイルがあるディレクトリに移動しておきましょう。なお、今回のコマンド処理はmacOS High Sierra以降でないと動作しません。

HEIFからJPEGへの画像変換

 画像形式と言えばJPEGがもっともメジャーでしょう。スマートフォンで撮影した画像もJPEG形式で保存されます。と、長年思っていたのですが、突如JPEGではなく拡張子がHEICという見慣れない、見たこともない画像形式のファイルで保存されていました。調べるとHEICはHEIF形式の拡張子とのこと。HEIFはHigh Efficiency Image Fileを略したもので高画質高圧縮。つまり少ないファイルサイズでも綺麗な画像のままになるという事です。容量の少ないスマートフォンやデバイスでは画像サイズは小さければ小さいほど有利です。

・HEIF (High Efficiency Image File)
https://ja.m.wikipedia.org/wiki/HighEfficiencyImageFileFormat

そう言えば他にもWebPという容量の少ない画像形式もあります。

・WebP
https://ja.wikipedia.org/wiki/WebP

画像形式(フォーマット)は非常に多くの種類があります。アプリケーションごとに画像形式の種類があるだけでなく個人でも自由に作れます。興味がある人は自分でオリジナルの画像形式を考えて作ってみると勉強になりますし、運がよければ他の人が利用するようになるかもしれません。

話がそれてしまいそうなので、元に戻しましょう。 MacだとHEIFはHigh Sierraからサポートされています。iPhone,iPadなどiOSはバージョン11からサポートされています。iOSでは撮影した画像の形式をHEIFにするかJPEGにするかを設定することができます。

  • 設定>カメラ>フォーマット

Androidだとバージョン9からサポートされているようです。以下の画面はGalaxy S20での設定例です。

HEIFに対応した機種やOSだけで画像ファイルをやりとりするだけならHEIFでもよいでしょう。高画質でファイルサイズも小さいからです。

しかし、WindowsやLinux,FreeBSDや古いMacなど他の環境で、そのままHEIF形式のファイルを渡してしまうと、受け取った側では見ることができません。また、画像を見るだけならよさそうですが、加工したりするとなると現状では対応しているアプリケーションが少ないようです。やはり、デファクトスタンダード(事実上の標準)であるJPEG形式やPNG形式に変換する必要がありそうです。

そんな時にはsipsコマンドの出番です。sipsコマンドを使えば簡単に形式を変換できます。以下の例ではIMG001.HEICファイルがimg001.jpgというJPEG形式のファイルに変換されます。 なお、iPhoneで撮影した画像の拡張子は大文字のHEICになります。iOSはファイル名、拡張子とも大文字ですが、Androidだと小文字になっています。

sips -s format jpeg IMG_0001.HEIC -o img001.jpg

これまでと同様にbash,zshのシェル展開機能を使えばHEIF形式の画像ファイルをまとめてJPEGに変換できます。

以下のようにするとカレントディレクトリにあるHEIF形式の画像をJPEGに変換できます。変換後の画像はサブディレクトリjpgimgに保存されます。

sips -s format jpeg *.HEIC -o ./jpgimg

拡張子が小文字の場合にも対応するには以下のように指定します。これまで何度も出てきた{ }で括る指定方法です。

sips -s format jpeg *.{HEIC,heic} -o ./jpgimg

JPEG以外にも以下の画像形式に変換できます。以下の表はサポートされている主な画像形式です。

jpeg JPEG形式
tiff TIFF形式
png PNG形式
gif Compuserve GIF形式
bmp Windows BMP形式
psd Photoshop形式

sipsがサポートしている形式を確認するには--formatsオプションを指定します。sips --formatsと入力すると図のように表示されます。OSのバージョンやsipsのバージョンによって異なると思われます。ここではBigSurでの結果を示しています。

------
Supported Formats:
-------------------------------------------
com.adobe.pdf                pdf   Writable
com.adobe.photoshop-image    psd   Writable
com.adobe.raw-image          dng   
com.apple.atx                --    Writable
com.apple.icns               icns  Writable
com.apple.pict               pict  
com.canon.cr2-raw-image      cr2   
com.canon.cr3-raw-image      cr3   
com.canon.crw-raw-image      crw   
com.canon.tif-raw-image      --    
com.compuserve.gif           gif   Writable
com.dxo.raw-image            dxo   
com.epson.raw-image          erf   
com.fuji.raw-image           raf   
com.hasselblad.3fr-raw-image 3fr   
com.hasselblad.fff-raw-image fff   
com.ilm.openexr-image        exr   Writable
com.kodak.raw-image          dcr   
com.konicaminolta.raw-image  mrw   
com.leafamerica.raw-image    mos   
com.leica.raw-image          raw   
com.leica.rwl-raw-image      rwl   
com.microsoft.bmp            bmp   Writable
com.microsoft.cur            --    
com.microsoft.dds            dds   Writable
com.microsoft.ico            ico   Writable
com.nikon.nrw-raw-image      nrw   
com.nikon.raw-image          nef   
com.olympus.or-raw-image     orf   
com.olympus.raw-image        orf   
com.olympus.sr-raw-image     orf   
com.panasonic.raw-image      raw   
com.panasonic.rw2-raw-image  rw2   
com.pentax.raw-image         pef   
com.phaseone.raw-image       iiq   
com.samsung.raw-image        srw   
com.sgi.sgi-image            sgi   
com.sony.arw-raw-image       arw   
com.sony.raw-image           srf   
com.sony.sr2-raw-image       sr2   
com.truevision.tga-image     tga   Writable
org.khronos.astc             astc  Writable
org.khronos.ktx              ktx   Writable
org.webmproject.webp         webp  
public.avci                  avci  
public.heic                  heic  Writable
public.heics                 heics Writable
public.heif                  heif  
public.jpeg                  jpeg  Writable
public.jpeg-2000             jp2   Writable
public.mpo-image             mpo   
public.pbm                   pbm   Writable
public.png                   png   Writable
public.pvr                   pvr   Writable
public.radiance              pic   
public.tiff                  tiff  Writable
-----

フォーマットと拡張子の右側にWritableという文字がありますが、この文字がある形式は書き出しが可能という意味です。例えばJPEGは書き出しできますが、WebPやDNG形式は書き出せないことになります。

ちなみに以前やったPortable BitMap、GrayMap、PixelMapもサポートされています。—formatsではPBMと表示されていますが、実際に変換してみるとフルカラー形式のPixelMapつまりPPM形式で出力されます。

 以下のようにするとHEIC形式の画像をPPM形式に変換できます。

sips -s format pbm IMG_0001.HEIC -o img001.ppm

実際に変換されたファイルを確認すると以下のようにPPM形式になっています。sipsコマンドを利用すればテキストエディタでPPM形式で画像を作成し一般的なJPEG,PNG形式に簡単できることになります。

P3
# 8-bit ppm - RGB
3024 4032
255
202 177 155 202 177 155 201 176 153 203 175 153 202 174 152 205 177 155 207 180 158 207
180 158 206 178 156 201 172 150 197 168 146 197 168 146 201 172 150 203 174 152 205 176
154 208 179 157 211 182 160 215 186 164 217 188 166 218 189 167 220 192 170 221 193 171
221 196 173 224 199 176 224 199 176 221 196 173 221 199 175 226 204 180 230 211 186 238

 変換可能な形式を確認するとJPEGからHEICにも変換できる事がわかります。以下のようにすると、カレントディレクトリにあるJPEG形式をHEIC形式に変換します。

sips -s format heic *.jpg -o ./

JPEG画像の圧縮率を指定して変換する

 JPEG形式に変換する場合には圧縮率を変える事ができます。JPEG形式が登場する前の画像形式は可逆圧縮が基本でしたが、JPEG形式からは非可逆圧縮でファイルサイズとのトレードとなっています。なお、あまり知られていないようですが、JPEG形式は可逆圧縮もできます。

sipsコマンドでもJPEG形式の圧縮率を指定して保存することができます。この場合、formatOptionsを使います。formatOptionsの後に圧縮率を示す0〜100の数値を指定します。以下のようにするとカレントディレクトリにあるJPEG画像(拡張子jpgのみ)を圧縮率20%でサブディレクトリjpeg20に保存します。

sips -s format jpeg -s formatOptions 20 *.jpg -o ./jpeg20

圧縮率で指定する数値が小さければ画質は悪くなります。数値が大きければ画質は良くなりますが、ファイルサイズは大きくなります。formatOptionsオプションの値をいろいろ変えて圧縮率とファイルサイズがどう変換するか、興味がある人はやってみてください。