<< Back

※すべてリトルエンディアン

APD (ver 1) ファイルの仕様

Windows 版 AzPainter/AzDrawing で保存された APD ファイル (ver 1) の仕様です。

APDヘッダ部
ヘッダ文字列 7Byte "AZPDATA"
バージョン数字 1Byte 0
全体のイメージ情報
データサイズ 4Byte データのバイト数 (=10)
イメージの幅 2Byte イメージの幅 (px)
イメージの高さ 2Byte イメージの高さ (px)
レイヤ数 2Byte ファイル中に存在するレイヤの数
レイヤ通算カウント 2Byte 今までいくつレイヤを作成したかという値。
レイヤを新規作成した場合の、デフォルトレイヤ名 ("レイヤ"+番号) に使われる。
※レイヤ名でしか使われないので、適当な値でも構いません。
カレントレイヤ番号 2Byte カレントレイヤのインデックス番号。
レイヤウィンドウから見て一番上にあるレイヤを 0 として、下にいくと +1。
ファイル内のレイヤは下層から順に記録しているので注意。
プレビューイメージ
プレビュー用に縮小した一枚絵のイメージデータ。
AzPainter では、90x90 に収まるサイズに縮小させたイメージを記録している。
画像の幅 2Byte プレビューイメージの幅 (px)
画像の高さ 2Byte プレビューイメージの高さ (px)
イメージデータサイズ 4Byte 下に続くイメージデータのバイト数。
0 でプレビューイメージなし。
イメージデータがある場合は [ 幅×高さ×4 ] がデータサイズとなる。
イメージデータ [上のサイズ分] 1px = 32bit、ボトムアップの DIB イメージデータ (無圧縮)。
DIB のイメージ部分のデータのみです。

X は左→右、Y は下→上の順で 32bit の色データが並んでいる。
色は B-G-R-A のバイト順。DWORD で読み込むと ARGB となる。
プレビュー時の読み込み処理を簡単にするため無圧縮にしてある。
レイヤデータ関連情報
ヘッダサイズ 4Byte 各レイヤ一つのヘッダ情報 (レイヤ名〜フラグまで) のバイト数。
通常は 35。
各レイヤデータ
以降、レイヤごとのデータが続く。
レイヤウィンドウから見て一番下のレイヤから順に格納されている。
レイヤ名 32Byte レイヤ名文字列 (Shift-JIS)。NULL 文字を含みます。
合成モード 1Byte レイヤの合成モード番号。

[0] 通常 [1] 乗算 [2] 加算 [3] 減算 [4] スクリーン [5] オーバーレイ [6] ソフトライト [7] ハードライト [8] 覆い焼き [9] 焼き込み [10] 焼き込みリニア [11] ビビットライト [12] リニアライト [13] ピンライト [14] 差の絶対値
(以降、AzPainter2 のみ) [15] 比較(明) [16] 比較(暗)
不透明度 1Byte レイヤの不透明度。
0〜128 (0 で透明、128 で完全不透明)

※ AzPainter 上では 0〜100 となっていますが、内部では計算速度を上げるため 0〜128 の値となっています。
フラグ 1Byte [0bit]
表示状態 (0 で非表示、1 で表示)
[1-2bit]
透明色保護 (0 でなし、1 で透明色保護 ON、2 で不透明色保護 ON)
[3bit]
アルファマスク (1 でON)
[4bit]
AzPainter2 のみ。
塗り潰し判定元 (1 でON)

※ AzPainter2 では、透明色保護とアルファマスクを合わせてレイヤマスクとしているので、アルファマスクが ON の時は透明色保護 (1-2bit) のデータは無視します。
イメージデータサイズ 4Byte 圧縮後のイメージデータバイト数。
イメージデータ [上のサイズ分] 圧縮されたレイヤのイメージデータ。
データは zlib を用いて deflate 圧縮されています。

展開後のデータは 32bit、ボトムアップの DIB データです。
なお、展開後のデータサイズはイメージの [ 幅×高さ×4 ] で計算できます。
(レイヤの画像サイズは全体のイメージサイズと同じです)

圧縮/展開する時は、データを丸ごと zlib に渡せば OK です。

サンプルプログラム

>> apdtobmp.cpp

APD ファイルから各レイヤイメージを取り出し、32bit BMP に出力します。
※別途 zlib が必要です。あらかじめ zlib をコンパイルしておきライブラリをリンクしてください。

ADW (ver 1) ファイルの仕様

AzDrawing ver 1.xx で保存された ADW (ver 1) ファイルの仕様です。
プレビューイメージが原寸大&圧縮されている以外は、ほぼ APD (ver 1) と同じです。

ADW ヘッダ部
ヘッダ文字 7Byte "AZDWDAT"
バージョン数字 1Byte 0
全体のイメージ情報ヘッダ部
イメージの幅 2Byte イメージの幅 (px)
イメージの高さ 2Byte イメージの高さ (px)
レイヤ数 2Byte ファイル中に存在するレイヤの数
レイヤ通算カウント 2Byte 今までいくつレイヤを作成したかという値。
新規レイヤを作成した場合のレイヤ名 ("レイヤ"+番号) に使われる。
※レイヤ名でしか使われないので適当でもかまいません。
カレントレイヤ番号 2Byte カレントレイヤのインデックス番号。
レイヤウィンドウから見て一番上にあるレイヤを 0 として、下にいくと +1。
レイヤイメージの圧縮形式 1Byte 0 で deflate 圧縮、1 で単純なゼロ圧縮。
ゼロ圧縮が使われるのは自動保存機能で保存されたファイルのみ。
普通に保存した場合は deflate 圧縮です。
プレビューイメージ部
全レイヤを合成させた一枚絵イメージ。
APD とは異なり、縮小されずに原寸大のサイズとなります。
幅と高さは、上記の全体イメージのサイズをそのまま使います。
圧縮前のデータサイズは [ イメージ幅 × 高さ × 4Byte ]。
イメージは deflate 圧縮されています。
データサイズ 4Byte 下に続くイメージデータの圧縮後のバイト数。
0 でプレビューイメージなし。
イメージデータ [上のサイズ分] 1px = 32bit、ボトムアップの DIB データを deflate 圧縮したデータ。
DIB のイメージ部分のデータのみです。

Xは左→右、Yは下→上の順で 32bit の色データが並んでいる。
色のバイト順は B-G-R-X、DWORD で読み込むと XRGB となる。

deflate 圧縮/展開については、zlib にデータをそのまま渡します。
各レイヤデータ
以降、レイヤ数分の各レイヤデータが順番に続く。
レイヤウィンドウから見て一番下のレイヤから順に格納されている。
レイヤ名 32Byte レイヤ名文字列 (Shift-JIS)。NULL 文字を含みます。
不透明度 1Byte レイヤの濃度。
0〜128 (0 で透明、128 で不透明)

※ AzDrawing 上では 0〜100 となっていますが、内部では計算速度を上げるため 0〜128 の値となっています。
フラグ 1Byte [0bit]
0 で非表示状態、1 で表示状態

[1〜2bit]
アニメーション時の扱い。
(0 でフレーム、1 で背景、2 で表示しない)
線の色 4Byte レイヤの線の色。
DWORD で読み込むと、XRGB。
イメージデータサイズ 4Byte レイヤのイメージデータを圧縮した後のバイト数
イメージデータ [上のサイズ分] レイヤのイメージデータ。
データは zlib を用いて deflate 圧縮されています。

8bit、トップダウンのイメージデータです。
X は 左→右、Y は 上→下 の順で並んでいる。
Y 1列のデータサイズは 4 バイト単位なので、イメージの幅が 4 で割り切れない場合は、1列ごとに 1〜3Byte 余分に付加されます。

Y1列のサイズ = (width + 3) & (~3)

圧縮・展開する時は、データを丸ごと zlib に渡せばOKです。

ADW (ver 2) ファイルの仕様

AzDrawing ver 2.xx で保存された ADW (ver 2) ファイルの仕様です。
ver 2 では、レイヤイメージは、64 x 64 px のタイルに分割されています。

ADW ヘッダ部 (ver 1 と共通)
ヘッダ文字 7Byte "AZDWDAT"
バージョン数字 1Byte 1
プレビューイメージ部
プレビュー用の縮小イメージ。
ver 1 では縮小されていない原寸大のイメージでしたが、ver 2 では 100 x 100 px に収まる程度に縮小されています。
2Byte イメージの幅 (px)
高さ 2Byte イメージの高さ (px)
圧縮サイズ 4Byte 下に続くイメージデータの圧縮後のバイト数。
0 でプレビューイメージなし。
イメージデータ [上のサイズ分] 1px = 32bit、ボトムアップの DIB データを deflate 圧縮したデータ。
DIB のイメージ部分のデータのみです。

X は左→右、Y は下→上の順で 32bit の色データが並んでいる。
色のバイト順は B-G-R-X、DWORD で読み込むと XRGB となる。
(内部で扱いやすくするために 32bit にしています。X の部分はアルファ値ではないので、無視してください)

ZIP 圧縮/展開については、zlib にデータをそのまま渡します。
全体の情報
データサイズ 2Byte 以下のデータ (キャンバス幅〜レイヤ情報サイズ) のバイト数。
現在は 12 Byte。
キャンバス幅 2Byte キャンバスの幅 (px)
キャンバス高さ 2Byte キャンバスの高さ (px)
DPI 2Byte 解像度の DPI 値
レイヤ数 2Byte レイヤの数
カレントレイヤ番号 2Byte カレントレイヤのインデックス番号。
レイヤウィンドウから見て上から順に 0、1、2、3…となる。
レイヤ情報サイズ 2Byte レイヤデータの、タイルデータを除いた情報部分のバイト数。
("left"〜"アニメカウント" までのデータ)
現在は 79 Byte。
各レイヤデータ
以降、レイヤ数分のレイヤデータが順番に続く。
レイヤウィンドウから見て一番下のレイヤから順に格納されている。
left 4Byte レイヤイメージの左上の X 座標 (px)
top 4Byte レイヤイメージの左上の Y 座標
right 4Byte レイヤイメージの右下の X 座標 (+1 した値)
bottom 4Byte レイヤイメージの右下の Y 座標 (+1 した値)
タイル数 4Byte レイヤデータに含まれるタイルの数
レイヤ名 50Byte レイヤ名テキスト (UTF-16LE)。NULL 文字を含みます。
不透明度 1Byte レイヤの濃度。
0〜128 (0 で透明、128 で不透明)

※ AzDrawing 上では 0〜100 となっていますが、内部では計算速度を上げるため 0〜128 の値となっています。
線の色 4Byte レイヤの線の色。
DWORD で読み込むと XRGB となる。
フラグ 1Byte [0 bit]
0 で非表示状態、1 で表示状態

[1 bit]
塗りつぶし参照のON/OFF

[2 bit]
レイヤマスク - 通常のマスク

[3 bit]
レイヤマスク - 下のレイヤをマスクに

[4 bit]
グループ化 - 通常のグループ化

[5 bit]
グループ化 - 下のレイヤをグループ化
フレームタイプ 1Byte アニメーションのフレームタイプ。

0 : 通常フレーム
1 : サブフレーム
2 : 共通フレーム
3 : 非表示
アニメカウント 2Byte アニメーションの表示フレーム数
※以下、「タイル数」 で指定された数だけタイルのデータが並ぶ。↓各タイルデータ
タイル位置X 2Byte このタイルの相対 X 位置
タイル位置Y 2Byte このタイルの相対 Y 位置
圧縮サイズ 2Byte タイルのイメージデータを圧縮した後のバイト数。
4096 で無圧縮。
0 または 4097 以上の値の場合はデータが壊れている。
タイルの
イメージデータ
[上のサイズ分] タイルのイメージデータ。
無圧縮でない場合、データは zlib を用いて deflate 圧縮されています。

8bit、64 x 64 px 分のデータです。
X は 左→右、Y は 上→下 の順で並んでいます。
無圧縮なら 4096 Byte。

圧縮・展開する時はデータを丸ごと zlib に渡せばOKです。

■ レイヤイメージの扱いについて

レイヤイメージは 64 x 64 px のタイル単位で、色がある部分のみイメージが確保されています。
全体に色がない透明なタイルはデータなしとなります。

■ left、top、right、bottom について

各レイヤのイメージは可変サイズです。
色がある部分の範囲 (px) が指定されています。

right - left が 0 、または bottom - top が 0 の場合は、レイヤの新規作成直後などで、全体が透明で色が全くない状態です。
(その場合、通常は left、top、right、bottom がすべて 0 となっています)
この場合、イメージのデータはありません (タイル数は 0)

例えば、(0、0、64、64) と指定されていたとすれば、(0、0)-(63、63) の範囲にイメージがあり、タイル数は 1 つだけ、となります。
right・bottom の値は実際の端の値を +1 した値となります。

■ タイル位置について

タイル位置は、left・top の位置を 0 とした、タイル単位での相対位置です。

タイル位置から実際の px 位置を計算する場合、
「タイルの左上の px 位置 = タイル位置 × 64 + (left または top)」
となります。

■ 合成後のイメージを作る

「移動」ツールでの移動などによって、キャンバスの範囲外にイメージがある場合があります。
各レイヤのイメージを読み込んで、キャンバス範囲内の表示可能部分の一枚絵を作りたい場合は、各タイルでキャンバス範囲外の部分は描画しないように合成していく必要があります。