sipsで画像を一括変換してみた
Nプログラマ(@Nprog128)です。
sips(scriptable image processing system)という画像を加工できるコマンドで、画像をpngからjpgに一括変換してみました。
最近までプレビュー.appでサイズを一括変換を使っていたのですが、動作がもっさりしていてちょっと不満でした。
ブログの写真などをコマンド一発で変換できるのでかなりラクになりました。
環境
- Mac OS X High Sierra 10.13.6
- sips 10.4.4
コード
変換のコマンドは以下の通り。
変換コード コードを開く
説明
このコマンドを実行すると、現在のディレクトリに存在する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のコマンドに渡します。
ちなみに以下のコマンドでは、拡張子なしのファイル一覧が取得できませんでした。 重要ではないので、折りたたんであります。
取得できなかったコード コードを開く
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でも問題ないようです)
使ってみる
一通り説明できたので、これを使って実際に変換しています。
準備
サンプルとして画像を準備します。
画像はなんでもいいですが、ここでは最近作った画像を使ってみます。
これを以下の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
コマンドを実行すると変換前のパスと変換後のパスがずらずらっと表示されます。
変換後はこんな感じ。
変換後の結果 コードを開く
問題なく変換できたようです。
本文 こんな感じでエラーが出る場合は、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