- (PNG や GIF のような)可逆圧縮の画像データを保存するタグ
- 例えば細かい模様は JPEG だとぼやけてダメなので
- 画像データ(パレットorビットマップ)を zlib 圧縮するが、PNG と違う独自フォーマット
- フォーマットによってパレット形式とビットマップ形式がある。どちらも独自形式
- 共通部分
+--------------------------------------------------------------------+---
| tag & length | length | image_id | format | width | height | ...
| 20 , 0x3f | | | | | |
+--------------------------------------------------------------------+---
<-- 2 bytes --><- 4 bytes -><-2 bytes-><-1 byte-><-2 bytes-><-2 bytes->
<------------------ length ---(最後まで)
- format 3 (GIF のようなパレット形式)
----------------------------------------------+
共通 |colormap_count| (colormap & indices) |
部分 | | zlib compressed |
----------------------------------------------+
<- 1 byte --><-- contents 残り全部 -->
RGBの順で並ぶ↓ ↑ zlib compress ↑
------------------------------------------------+
| colormap | indices |
------------------------------------------------+
<-- colormap --><-((width + 3) & -4) * height->
count * 3
- format 4 (実物にお目にかかった事がないけど…)
----------------------------------------------+
共通 |colormap_count| (colormap & indices) |
部分 | | zlib compressed |
----------------------------------------------+
<--1 byte --><-- contents 残り全部 -->
↑ zlib compress ↑
------------------------------------------------+
| colormap | indices |
------------------------------------------------+
<-- colormap --><-((width + 3) & -4) * height->
count * 2
- colormap を 0RRRRRGGGGGBBBBB の 16bit (BigEndian)で表現する
(36) DefineBitsLossless2†
- 共通部分 (DefineBitsLossless と同じ)
+--------------------------------------------------------------------+---
| tag & length | length | image_id | format | width | height | ...
| 36 , 0x3f | | | | | |
+--------------------------------------------------------------------+---
<-- 2 bytes --><- 4 bytes -><-2 bytes-><-1 byte-><-2 bytes-><-2 bytes->
<------------------ length ---(最後まで)
- format 3 (GIF のようなパレット形式)
----------------------------------------------+
共通 |colormap_count| (colormap & indices) |
部分 | | zlib compressed |
----------------------------------------------+
<-- 1 byte -><-- contents 残り全部 -->
RGBAの順で並ぶ↓ ↑ zlib compress ↑
------------------------------------------------+
| colormap | indices |
------------------------------------------------+
<-- colormap --><-((width + 3) & -4) * height->
count * 4
(メモ) colormap_number†
- colormap_number には実際に使われる色数から 1 を引いた値が入る。(つまり 0 数えのカウント)
- 1byte で 1色~256色 を表したいので。(そのままだと255色までしか届かない)
(メモ) RGB と A の絡み†
- A が 0 でも 255 でもない時は、RGB はズバリ入ってなくて、A に応じて補正されてます。
BitmapPixelData ARGB[image data size]
Array of pixel colors.
Number of entries is BitmapWidth * BitmapHeight.
The RGB data must already be multiplied by the alpha channel value.
(メモ) ((width + 3) & -4) * height って?†
witdh = 1 の場合 => ((1 + 3) & -4) = 4 & 11(略)1100 = 4
witdh = 2 の場合 => ((2 + 3) & -4) = 5 & 11(略)1100 = 4
witdh = 3 の場合 => ((3 + 3) & -4) = 6 & 11(略)1100 = 4
witdh = 4 の場合 => ((4 + 3) & -4) = 7 & 11(略)1100 = 4
witdh = 5 の場合 => ((5 + 3) & -4) = 8 & 11(略)1100 = 8
- つまり、4の倍数への繰り上げ処理。Windows BMP もピクセルデータはこんな並びだし、まぁ普通。
- % 4 とか mod 4 とか書いても良いけど、alexref にリスペクトして、あえてそのまま使ってます。(実コードでこの式使うと処理速そうだし)