Photoshop Document File(PSD)


フォーマット


バージョンの古い形式(Photoshop 2.0仕様)です。
ここに労力を使うつもりはないので、途中で投げ出してます。
ローダー作った人いたらください(笑)。



う~む、やはりレイヤーの読込・保存もしたいと思い、
久々に触ってみる。うむ、よくこんな物いじってたな。

C++、C#に関してはCode Projectにクラス公開されてる人がいます。
CMYKやLABにも対応してるので、そういう物を使った方が楽だと思う。

Delphi、GraphicEXを使おうかとも思ったけど、MPLというライセンスが
今ひとつ不明瞭だったのと、読込のみ、またレイヤーを読み込んでいる訳ではないので、
結局これじゃ物足りないなと。

PSDにはレイヤー別のイメージと、一枚に合成したイメージの両方が入ってます。
旧バージョンの互換性のためかな?
イメージセクションのデータさえ読んでやれば、ビューアーなど
レイヤー機能を持たないアプリケーションでも、合成演算などの処理
の必要なしに合成画像は表示できます。
レイヤーを一枚一枚読もうと思うと複雑になるけど。

3.0仕様からレイヤー機能がついていて、Reservedセクションが使われているのですが、
レイヤーの画像データもそこにどんどん挟んでいく形。
オフセットアドレス探すのが面倒くさい。






PackBitsの展開


8 * 8 ピクセルの矩形を描いた画像を作ったとすると、圧縮されたバイナリイメージは下記のように。
これを横一ラインずつ解凍 ;

F9 00 ←(00の値が8個続く)
00 00 FB FF 00 00 ←(00の値が1個、FFの値が6個、00の値が1個)
00 00 FB FF 00 00
00 00 FB FF 00 00
00 00 FB FF 00 00
00 00 FB FF 00 00
00 00 FB FF 00 00
F9 00

最初の1バイト (-127~127) が正の数値の時は非連続データの個数-1。次に個数分、データが続きます。
負の数値の時は連続データの個数-1、次の1バイトが値。

00 00 00 00 00 00 00 00
00 FF FF FF FF FF FF 00
00 FF FF FF FF FF FF 00
00 FF FF FF FF FF FF 00
00 FF FF FF FF FF FF 00
00 FF FF FF FF FF FF 00
00 FF FF FF FF FF FF 00
00 00 00 00 00 00 00 00

正 の数値が00しかないので例としてはよくないですね(^-^;

ただ、 圧縮時のImage Dataは先頭に幅1ライン分のデータ長が (画像の高さ * チャンネル数 * Word)分入ってます。
最初、これでひっかかってしまいました(^-^;
横1ラインを何バイトに圧縮したかという情報です。上記のデータだと下記のようなデータがWordで入ってます。

02 00 06 00 06 00 06 00 06 00 06 00 06 00 02,00

2 , 6 , 6 , 6 , 6 , 6 , 6 , 2

参考リンク



最終更新:2007年02月28日 18:19