ESP8266でPNGデコーダを実装してみた

esp826613.jpg

前回、「ESP8266でオンメモリでPNGをデコードするのは難しいかも」と書きましたが、あれこれ考えた結果、ぎりぎり何とかなりそうな見通しが立ったので、この3連休を使って実装してみました。

Deflate圧縮の伸張には、前回紹介した中から「tiny inflate」を選びました。

jibsen / tinf — Bitbucket

PNGファイル自体の扱いは、主に以下を参考にしながら自力で書きました。

apankrat/lpng
PNG画像を自力で読む
Portable Network Graphics (PNG) Specification (Second Edition)

懸念点だったメモリについては、グローバルメモリに32KBのリングバッファと、スキャンライン2本分のバッファを用意しました。
前者はLZ77圧縮の復号、後者は復号後のフィルター処理にどうしても必要となりますが、これだけで

グローバル変数が 72,814バイト (88%) の 動的メモリを使用しており、ローカル変数に 9,106 バイトが残っています。最高は 81,920バイトです

という状態になっており、かなり苦しい感じです。

描画速度もGIFより遅いので、フルカラーが使えるという以外にはあまりメリットは無いかもしれません。

コメント