画像処理を取り扱っていると、Adobe社製アプリケーションで使用されるPSDファイルを扱うことがあります。Windows環境での自作のアプリケーションでPSDファイルを取り扱いたいとき、jpegファイルでは、ライブラリが公開されていたりしますが、PSDファイルは公開されているライブラリが少ないです。
そこで、各レイヤーの画像を出力するPSDライブラリをWindows環境で作成してみることにしました。Adobe社がPSDファイルのフォーマットを公開しているので、そのフォーマット情報を基に作成します。
PSDファイルのフォーマットは以下の構成になっているようです。
まず、ファイルの先頭のヘッダー部ですが、ヘッダー部は以下の構成となっています。
1. Signature(4バイト) : 常に”8BPS” が入っている
2. version(2バイト) : 常に1が入っている
3. reserved(6バイト) : リザーブ領域、0で埋められている
4. Channels(2バイト) : カラーチャンネル数
5. row(4バイト) : 画像の高さ
6.columns(4バイト) : 画像の幅
7. Depth(2バイト) : チャンネル当たりのビット数(1,8,16のいずれか)
8. Mode(2バイト) : カラーモード
カラーモードの詳細は以下の通りです。
- 0:Bitmap(monochrome)
- 1:Gray-scale
- 2:Indexed color(palette color)
- 3:RGB color
- 4:CMYK color
- 7:Multichannel color
- 8:Duotone(harftone)
- 9:Lab color
PSDファイルをバイナリエディタで確認すると以下のようになっておりました。
次に、Color Mode Block部とImage Resource部については、レイヤー画像の出力に特に関係がなさそうなので、スキップさせることにします。
ちなみにColor Mode Block部とImage Resource部については、Color Mode Block部はヘッダー部のカラーモードがIndexed Colorの時とDuotoneの時に確認する箇所で、Image Resource部は、古いPhotoshopでMacintosh向けの環境で使用する箇所だそうです。
次のLayer and Mask Informationブロック部ですが、ここは名称通りレイヤーやマスク画像の情報が入っているようです。構造としては以下のようになっているようです。
- Layer and Mask Information Blockのサイズ(4バイト)
- レイヤー情報の終端までのサイズ(4バイト)
- レイヤー数(2バイト)
- レイヤー数分のレイヤー情報
レイヤー情報は以下のようになっているようです。
- レイヤーの上端位置(4バイト)
- レイヤーの左端位置(4バイト)
- レイヤーの下端位置(4バイト)
- レイヤーの右端位置(4バイト)
- レイヤーのチャンネル数(2バイト)
- チャンネル数分のチャンネルデータ
- Blend Mode Signature(4バイト) : 常に”8BIM”が入っている
- Blend Mode Key(4バイト)
- Opacity(1バイト) : 透明度(0~255)
- Clipping(1バイト ) : baseの時は0、non-baseの時は1
- Flag(1バイト) : bit0が透明度保護、bit1が可視
- Padding(1バイト) : 0で埋められている
- Extra Data Size(4バイト) : ここからレイヤー情報の最後までの長さ
- レイヤーマスクデータの長さ(4バイト)
- レイヤーマスクの上端位置(4バイト)
- レイヤーマスクの左端位置(4バイト)
- レイヤーマスクの下端位置(4バイト)
- レイヤーマスクの右端位置(4バイト)
- デフォルトカラー(1バイト) : 0か255が入る
- Flag : bit0が位置、bit1がレイヤーマスク無効、bit2がinvert layer mask
- Padding(2バイト) : 0で埋められている
- Blending Rangesのデータの長さ(4バイト)
- Gray Blend Source(4バイト)
- Gray Blend Destination(4バイト)
- Channel Source Range情報×n
- レイヤー名の長さ(1バイト)
- レイヤー名 : Pascal string
- レイヤーリソースデータ
- レイヤーデータ
レイヤーデータは、以下の構成となっているようです。
- compression(2バイト) : 圧縮フラグ
- RLE幅長さ(2バイト)
- 画素データ
PSDファイルでは、デフォルトでは画素データを圧縮しています。圧縮方式は連長圧縮(ランレングス圧縮、RLE:Run Length Encoding)方式という可逆圧縮方式です。
実際にPSDファイルをバイナリエディタで確認してみることにします。
Blend Mode Signatureを確認したところ、確かに”8BIM”という文字列が入っていることが確認できます。(赤い枠で囲まれている部分です。)
他の箇所もバイナリエディタで確認してみたところ、レイヤーの画像のみを取り出すのであれば出力できそうなことが分かりました。
画素データからpngファイルを作成するライブラリを作成したところ、以下のような結果を得られました。
[元ファイル]
[ライブラリで出力した画像]
背景レイヤー
レイヤー1枚目
レイヤー2枚目
今回の目的であるPSDファイルからレイヤーの画像を出力することは出来ました。
Photoshopでは、テキストレイヤーや歪みなど様々な機能が追加されています。それらの機能については、今後調査してみたいと思います。
参考:http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/