2011年4月27日水曜日

ImageMagickのPSDの扱い方

  • ImageMagickにおけるPSDの扱い方
  • PSDのレイヤを比較的正しく扱ってくれるフリーウェアはこれとGIMPくらいでPaint.NETは論外でした。多分元ソースをゲーム用のとあるライブラリからとってるであろうやつはなんかダメそう。
  • Photoshopではレイヤに特殊効果がつけられるのですが、これが無視されてしまう。
  • コマンドラインが結構いろんな組み合わせでききいれてくれるので混乱するですね。
  • 今日の嘘情報 : レイヤ付のPSDはImageMagickで出力するとレイヤが全て書き出されるので-flattenのオプションをつけると正常に出力されるよ。これは嘘これで成功するケースは偶然レイヤがみんな同じサイズで、偶然移動されてないだけのことだ。ああ、あとレイヤの特殊効果もこの書き方だと消滅します、よいとこなしです。
  • PSDをかたっぱしから流し込んでためしてみればわかるけどレイヤのサイズがまちまちだとレイヤの重ね合わせも出力サイズもずれてしまって悲しいことになる。
  • レイヤ付のPSDは特殊なシーケンスとして扱われる。hoge.psd[0]がレイヤをすべて結合した画像。[1]番以降は各レイヤを底から見ていく。アニメーションGIFと同様な感じです。
  • なので正常に重ね合わせが行われた、画像をPSDから出力したい場合は単に
  • convert hoge.psd[0] -geometry 100x100 moge.gif
  • と書けばよい。
  • 理由があってレイヤを-flattenで重ね合わせたいときはもう少し複雑。
  • Identify hoge.psdからレイヤの枚数と、各レイヤのオフセットを取得。出力の真ん中くらいにある100x100-10+20の-10+20の部分。
  • identify -format %X%Y hoge.psd[1]
  • という感じで取得可能、で-pageで各レイヤにオフセットを指定してあげると正しい位置にレイヤが配置される。全てのレイヤの情報が欲しければ下のように書けばいい
  • identify -format %X%Y, hoge.psd
  • こう書くことでCSV風に出力されて、スクリプトの中で扱いやすくなる。カンマが重要
  • でここで得た出力が以下のようなものの場合
  • +0+0,+0+0,-100+50,+163+22
  • このようにconvertで全てのレイヤを結合してあげれば正しく重ね合わされた画像が得られる。
  • convert -page +0+0 hoge.psd[1] -page -100+50 hoge.psd[2] -page +163+22 hoge.psd[3] -flatten result.gif
  • この際Phostoshopレイヤの特殊効果はなくなってしまうことに注意が必要。
  • (追記)これだけでは情報が不十分なのでこちらのページも参考にしてください
  • (追記)ImageMagickでPSDのレイヤを何かしようという人がどれだけの数いるかは疑問ですが