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

アイキャッチ画像


記事内に商品のプロモーションを含む場合があります。

Nプログラマ(@Nprog128)です。

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

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

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

環境

  • Mac OS X High Sierra 10.13.6
  • sips 10.4.4

コード

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

変換コード コードを開く
変換コード
1  ls | xargs -I{} basename {} .png | xargs -I{} sips -s format jpeg {}.png --out {}.jpg

説明

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

バックアップを!

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

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

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

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

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

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

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

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

 1# lsを実行
 2\$ ls
 3010.png
 4020.png
 5030.png
 6040.png
 7050.png
 8060.png
 9070.png
10080.png
11090.png
12100.png
13
14# ファイル名のリストを取得
15\$ ls | xargs -I{} basename {} .png
16010
17020
18030
19040
20050
21060
22070
23080
24090
25100

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

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

取得できなかったコード コードを開く
取得できなかったコード
 1# うまくいかなかったコマンド
 2\$ basename *.png .png
 3
 4010.png
 5020.png
 6030.png
 7040.png
 8050.png
 9060.png
10070.png
11080.png
12090.png
13100.png

sipsコマンドで変換

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

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

フォーマットの指定

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

1-s format jpeg

入出力ファイルの指定

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

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

使ってみる

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

準備

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

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

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

 1sample
 2├── 010.png
 3├── 020.png
 4├── 030.png
 5├── 040.png
 6├── 050.png
 7├── 060.png
 8├── 070.png
 9├── 080.png
10├── 090.png
11└── 100.png

画像の準備完了です。

実行

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

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

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

変換後の結果 コードを開く
変換後の結果
 1\$ ls | xargs basename
 2
 3010.jpg
 4010.png
 5020.jpg
 6020.png
 7030.jpg
 8030.png
 9040.jpg
10040.png
11050.jpg
12050.png
13060.jpg
14060.png
15070.jpg
16070.png
17080.jpg
18080.png
19090.jpg
20090.png
21100.jpg
22100.png

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

エラーが出る場合

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

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

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

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

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

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

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

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

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

おわりに

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

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

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

参考

  • man sips
\ ちょっとお買い物 /


関連した記事