この記事はPSDファイルの構造(基本構造編)からの続きになります。
イメージデータセクション
各レイヤーごとの画像データを管理するセクションです。
レイヤーとマスクセクションのデータサイズにてレイヤー情報を全て読み込んだ直後のアドレスがイメージデータセクションになります。
このアドレスを基準に各レイヤーのチャンネルごとにイメージデータセクションのアドレスを計算します。
チャンネルが 3の場合は下記の順にイメージデータセクションに格納されています。
レイヤー0のチャンネル0のアドレスはレイヤー情報に続くアドレスが該当し、レイヤー0チャンネル1のアドレスは レイヤー0 のチャンネル0のデータサイズを加算した値が該当するイメージデータのアドレスになります。
レイヤー | チャンネル |
---|---|
0 | 0 |
0 | 1 |
0 | 2 |
1 | 0 |
そのためレイヤー情報を読み込んだ後は、イメージデータセクションのアドレス計算を行う必要があります。
イメージデータ
セクション内にある1レイヤーの1チャンネルの画像データが格納されてるのがイメージデータです。
イメージデータは先頭2バイトが圧縮方法を表し、それ以降が実際のデータになります。
値 | 圧縮方法 |
---|---|
0 | 無圧縮 |
1 | RLE圧縮 |
無圧縮
圧縮しないデータ管理方法です、小さいサイズのデータの場合に採用されます。
イメージデータが縦32w x 横16h ピクセルで8bitのデータの場合
32w x 16h * 8bit / 8 = 512
512バイトのデータを読み込み画像データとします。
これを3チャンネル RGB分のデータを読み込み 1ピクセルがRGBそれぞれ 8bitの値を持つRGBの画素になります。
RLE圧縮
同じデータが繰り返される場合に最適な圧縮方法です。圧縮率はデータによって変わるため処理が完了するまでサイズは不明です。
イメージデータのY座標ごとに読み込むデータのバイト数を取得します。
size | |
---|---|
2 | Y=0 のデータバイト数 |
2 | Y=1 のデータバイト数 |
中略 | |
2 | Y=15 のデータバイト数 |
次に Y=0の座標から順に圧縮データを処理します。
各Y座標毎にX=0の地点から展開作業を開始します。
データのバイト数分を読み込んで展開処理が終わった後は
次のY座標に処理を移し、またX座標が0から再開します。
展開処理は下記の手順で行います。
1.データを1バイト取得
2.データが128未満であれば処理(3) データが128より大きい場合処理(9)へ
3.取得したデータに1を加算ループ回数とします、つまり 0であれば 1回処理に入ります
4.ループ処理の先頭
5.データを1バイト取得
6.[x,y]座標のデータとして格納
7.x座標を1加算
8.ループ(4)を繰り返す
9.取得したデータを FFhと XORした後 2加算したものをループ回数とします(2の補数)
10.データを1バイト取得
11.ループ処理の先頭
12.[x,y]座標のデータとして格納
13.x座標を1加算
14.ループ(11)を繰り返す
15.次のy座標がある場合は処理(1)からさいかい