データ圧縮する際に最初に考えるのは「まとめる」事と同じ表現をより小さい値に「置き換える」事です。一箇所指定したら、周辺にドドドッと配置してしまえば、それだけでかなり省メモリです。座標系が1024x512だと座標系はデータが大きいですが、前回のデータからのオフセットにすると小さくなります。

また、例えばドット絵がタイリングで色を作り出しているとします。1ラインおきにタイルパターンが異なっていると、ランレングス圧縮にはとても不利なデータ列になります。そこで、一つ前のラインと XOR をしたデータをランレングス圧縮すると、同じ値が単純に並ぶ、とてもランレングスで圧縮しやすいデータ列に変わります。

より具体的に説明してみましょう。例えば、以下のようなデータ列があったとします。

$01, 14, 15, $03, 9, 16, $01, 11, 19, $01, 13, 22, $03, 15, 23
このデータは3バイト1組の構成です。順にデータ番号、X座標、Y座標を表しているとします。ここでまず注目するのは、それぞれのデータの最大値と最小値です。データ番号は$01と$03の2種類です。X座標が最小が9最大が15です。そして、Y座標は最小が15最大が23となっています。データ番号は2種類ですから、1bitで表すことが出来ます。Xは4bit、Yは5bitです。

ところでY座標は順に大きくなっているのが分かります。そのため、前回のY座標から差分をデータとして持つとどうでしょうか。Y座標だけに注目すると、最初だけは15としなければいけませんが、以降は +1, +3, +3, +3, +1 となります。この数値であれば2bitで収まります。すると…
データ構造
なんと1バイトに収まりました。3バイトが1バイトですので33%のデータ圧縮となります。或いは、XY座標の原点を 9,15 として、そこからのオフセットと考えると、データは以下のように変化します。

$01, 5, 0, $03, 0, 1, $01, 2, 4, $01, 4, 7, $03, 6, 8
さらにデータ番号は 0,1 で、Y座標を以前の座標からのオフセットにします。

[ 0, 5, 0 ], [ 1, 0, 1 ], [ 0, 2, 3 ], [ 0, 4, 3 ], [ 1, 6, 1 ]

小さな数値だけで構成されるデータ列になりました。データ番号は1bit、X座標は3bit、Y座標は2bitの、合計6bitで収まってしまいました。15バイトが5バイトです。こんな感じでデータの値が小さくなっていく方法を考えていくと、データの圧縮がしやすくなっていきます。大事なのはそのデータの癖とか特徴とかを如何に掴むかって事ですね。ご参考になれば幸いです。ではまたー
アイリスオーヤマ 工具箱 パーツキャビネット PC-310
アイリスオーヤマ(IRIS OHYAMA)
※ 抵抗やネジなどの細かなパーツを保存管理するのにとても便利!