sipsコマンドは使えるかも

印刷屋としては、画像処理は避けて通れない道だったりします。
最近は何でもアプリケーションサーバで処理する傾向があって、ファイル容量も大きなものを扱う必要があったりなど、ちょっと悩みの種でもあります。
今の所、JavaJava Image I/O API を使っていますが、Javaでデカイ画像を扱うのは勇気がいります。それに、CMYKの扱いが今ひとつだったりしますし。

Photoshopを使えば簡単にできるような処理も、サーバ上でそれをやる訳にも行かず(やって出来ない事は無いだろうけど・・)、どうしたものかと考えておりました。

そこで、せっかく画像処理に強いと言われる(笑)Mac OSX を運用プラットフォームにしている強みを生かして、何か簡単で良い方法が無いかと調べていた所・・・やっぱりありました。


sipsコマンドです。なんだ、Pantherからあったのか。知らんかった(笑)

sipsで出来る事

このページ(http://developer.apple.com/jp/technotes/tn2035.html)に日本語の解説が載っていました。

  • 各種ラスタイメージ形式の読み書きと変換
  • jpegJfif および Xiff)、GIF、PNG
  • 基本的画像処理
  • 回転、反転、切り取り、パディング、再サンプリング、解像度変更
  • カラーマネージメント操作
  • プロファイルの埋め込み、抽出、調整
  • 既知のメタデータタグの読み書き
  • 可能な限りのオリジナルコンテンツの維持

印刷屋的には、おそらく一番最後の「可能な限りのオリジナルコンテンツの維持」ってのが重要な気がします。

これから書く事は、実は2003年12月のこの記事(http://journal.mycom.co.jp/column/osx/073/)と、ほとんどかぶってしまう事が判明しましたが、個人的なテストの結果としてメモしておきます。

画像のプロパティを取得する

取れるだけ取ってくる
sips -g all imageFile

$ sips -g all test.jpg
/test.jpg
pixelWidth: 3136
pixelHeight: 2352
typeIdentifier: public.jpeg
format: jpeg
formatOptions: default
dpiWidth: 314.000
dpiHeight: 314.000
samplesPerPixel: 3
bitsPerSample: 8
hasAlpha: no
space: RGB
creation: 2006:01:09 11:49:37
make: OLYMPUS IMAGING CORP.
model: E-330
software: Version 1.0
description: OLYMPUS DIGITAL CAMERA

縦横のピクセル数、解像度、カラースペースはもとより、メタデータのたぐいも拾って来れますね。

ピクセル数を取ってくる
sips -g pixelHeight -g pixelWidth imageFile

$ sips -g pixelHeight -g pixelWidth test.jpg
/test.jpg
pixelHeight: 2352
pixelWidth: 3136

不要な情報がいらない場合は、-gオプションに欲しいプロパティ名をつければOKです。

複数画像のプロパティを取ってくる
sips -g propertyName imageFile1 imageFile2...

$ sips -g pixelHeight -g pixelWidth test.jpg test2.jpg
/test.jpg
pixelHeight: 2352
pixelWidth: 3136
/test2.jpg
pixelHeight: 2304
pixelWidth: 1736

もちろん、ファイル名はワイルドカードでもOKです。例えばJPEGのみの場合は、*.jpgなどとします。

画像のフォーマットを変更する

TIFFに変換する
sips -s format tiff --out outImage imageFile

$ sips -s format tiff --out out.tiff test.jpg
/test.jpg
/out.tiff

画像のフォーマットは、jpegtiffpng、gif、jp2、pict、bmp、qtif、psdとなっています。

ちなみに、TIFF変換した画像のプロパティを見てみると、ちゃんと「可能な限りのオリジナルコンテンツの維持」ってのが果たされているのが分かります。

$ sips -g all out.tiff
/out.tiff
pixelWidth: 3136
pixelHeight: 2352
typeIdentifier: public.tiff
format: tiff
formatOptions: default
dpiWidth: 314.000
dpiHeight: 314.000
samplesPerPixel: 3
bitsPerSample: 8
hasAlpha: no
space: RGB
creation: 2006:01:09 11:49:37
make: OLYMPUS IMAGING CORP.
model: E-330
software: Version 1.0
description: OLYMPUS DIGITAL CAMERA

JPEG画像の品質を指定して保存する
sips -s format jpeg -s formatOptions default | [low|normal|high|best|] |packbits --out outImage imageFile

$ sips -s format jpeg -s formatOptions low --out outImage test.jpg
/test.jpg
/out.jpg

formatOptionは直接パーセント指定も出来るようです。

$ sips -s format jpeg -s formatOptions 50 --out outImage test.jpg
/test.jpg
/out.jpg

画像をリサイズする

幅を300ピクセルにする
sips --resampleWidth 300 --out outImage imageFile

$ sips --resampleWidth 300 --out out.jpg test.jpg
/test.jpg
/out.jpg

このリサイズは、縦横比を維持したまま、幅を300ピクセルにリサンプルします。また、高さの指定は --resampleHeight になります。

幅を300ピクセル、高さを200ピクセルにする(変形)
sips -resampleHeightWidth height width --out outImage imageFile

$ sips --resampleHeightWidth 300 200 --out out.jpg test.jpg
/test.jpg
/out.jpg

縦横比を変更したい場合はこのオプションを使います。

縦横比を変えずに、最大ピクセル数を100とする
sips --resampleHeightWidthMax 100 --out outImage imageFile

$ sips --resampleHeightWidthMax 100 --out out.jpg test.jpg
/test.jpg
/out.jpg

結構使えるオプションかも知れません。DTP系の言葉で言えば(?)縦横100ピクセルのボックスにフィットするように画像を縮小する言えばよいでしょうか。

ちなみに、これらのコマンドは実際の画像のピクセル数が指定より小さい場合、逆に拡大されてしまうので要注意です。

サーバー用途?

sipsコマンドは必要最低限な実装になっています。ただ、将来的にはフィルターやレイヤーを扱えるようにしたいとAppleさんも言ってます*1ので、そのうち何とかなるかもしれません。


アプリケーションサーバで使うとしたら、アップロードされた画像のフォーマットチェックとか、画像のリサイズ等に使えますね。
ただ、個人的に使えない理由の一つに、グレースケールに変換等の処理が出来ない事です。あー、これさえあれば今すぐにでも使うのになぁ。やっぱりQuartz2D APIを叩かないと駄目かなぁ。