2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【解説】PSDファイルの仕様(イメージデータセクション)

Last updated at Posted at 2022-09-01

この記事は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)からさいかい

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?