sipsで画像を一括変換してみた



Nプログラマです。

sips(scriptable image processing system)という画像を加工できるコマンドで、画像をpngからjpgに一括変換してみました。

最近までプレビュー.appでサイズを一括変換を使っていたのですが、動作がもっさりしていてちょっと不満でした。

ブログの写真などをコマンド一発で変換できるのでかなりラクになりました。

環境

  • Mac OS X High Sierra 10.13.6
  • sips 10.4.4

コード

変換のコマンドは以下の通り。

変換コード コードを開く
変換コード

  ls | xargs -I{} basename {} .png | xargs -I{} sips -s format jpeg {}.png --out {}.jpg

説明

このコマンドを実行すると、現在のディレクトリに存在するpngのファイルを全てjpgに変換します。

バックアップを!

変換前のファイルは残りますが、念の為に変換前にはファイルのバックアップを取りましょう。

コマンドを実行するディレクトリ内にバックアップをしても変換されてしまうので、別の場所に保存しましょう。

拡張子なしのファイル名を取得

  ls | xargs -I{} basename {} .png

sipsコマンドにファイル名を渡すための準備をします。

basenameの引数に拡張子を渡すと、その拡張子を非表示にすることができます

これを使ってlsコマンドの出力結果の拡張子付きファイル名を一つずつbasenameコマンドに渡すことで、 拡張子なしのファイル名のリストを表示するすることができます。

実行すると、こんな感じ。

# lsを実行
\$ ls
010.png
020.png
030.png
040.png
050.png
060.png
070.png
080.png
090.png
100.png

# ファイル名のリストを取得
\$ ls | xargs -I{} basename {} .png
010
020
030
040
050
060
070
080
090
100

この結果をパイプでsipsのコマンドに渡します。

ちなみに以下のコマンドでは、拡張子なしのファイル一覧が取得できませんでした。 重要ではないので、折りたたんであります。

取得できなかったコード コードを開く
取得できなかったコード

# うまくいかなかったコマンド
\$ basename *.png .png

010.png
020.png
030.png
040.png
050.png
060.png
070.png
080.png
090.png
100.png

sipsコマンドで変換

xargs -I{} sips -s format jpeg {}.png --out {}.jpg

先程取得できた拡張子なしのファイル一覧を受け取るsipsコマンドです。

フォーマットの指定

フォーマットの指定はjpegを指定しています。
manコマンドで確認すると対応している拡張子はjpegと表示されているので、 jpgと書かないように注意します。

-s format jpeg

入出力ファイルの指定

最後に入力ファイルと出力ファイルの指定です。 xargsの引数名を{}としているので、この中に拡張子がないファイル名が入っています。

入力ファイルはpngなので{}.png、出力ファイルは–outで指定してjpgで出力したいので{}.jpgにしています(ここの拡張子はjpgでも問題ないようです)

使ってみる

一通り説明できたので、これを使って実際に変換しています。

準備

サンプルとして画像を準備します。
画像はなんでもいいですが、ここでは最近作った画像を使ってみます。

メダル010 メダル020 メダル030 メダル040 メダル050
メダル060 メダル070 メダル080 メダル090 メダル100

これを以下のsampleディレクトリに配置します。

sample
├── 010.png
├── 020.png
├── 030.png
├── 040.png
├── 050.png
├── 060.png
├── 070.png
├── 080.png
├── 090.png
└── 100.png

画像の準備完了です。

実行

sampleディレクトリに移動してコマンドを実行します。

\$ ls | xargs -I{} basename {} .png | xargs -I{} sips -s format jpeg {}.png --out {}.jpg

コマンドを実行すると変換前のパス変換後のパスがずらずらっと表示されます。
変換後はこんな感じ。

変換後の結果 コードを開く
変換後の結果

\$ ls | xargs basename

010.jpg
010.png
020.jpg
020.png
030.jpg
030.png
040.jpg
040.png
050.jpg
050.png
060.jpg
060.png
070.jpg
070.png
080.jpg
080.png
090.jpg
090.png
100.jpg
100.png

問題なく変換できたようです。

エラーが出る場合

本文 こんな感じでエラーが出る場合は、lsコマンドに-Fオプションがついているかもしれません。

Warning: ファイル名.png*.png not a valid file - skipping
Error 1: no file was specified

このオプションがついていると、実行可能なファイルにはアスタリスクが表示されます。

なので、画像変換するときに正しいファイル名が渡されないためエラーが表示されます。

whichコマンドなどを使って、lsコマンドがaliasでオプションがついていないかを確認してみましょう。

自分の場合は、-G-Fオプションがついていました。

\$ which ls
ls: aliased to ls -G -F

aliasを使わず実行する場合は、コマンドの前にバックスラッシュをつけるとaliasをその時だけ無効にできるので、試してみてください。

lsの場合だと、\lsとなります。

おわりに

今回はsipsコマンドで画像形式を一括変換する、という内容でした。

大量に画像を一括変換する時などにお役立てください。

それでは、このへんで。
バイナリー!

参考

  • man sips


関連した記事