2024-02-27 (火)
気づいたらGIFのデコーダをC++で実装していた。。。
昨日の続き。
サーバで生成したビットマップ画像をESP32でダウンロードして電子ペーパーに書き込んだりしたのだけど、サイズが大きいし、かといってPNGはメモリが少ないと扱いにくいので、GIFを使うことに。
GIFの構造上は、ネットワーク越しに読み込みながらディスプレイに書き込めば、入力データもデコード済みのピクセルデータもメモリ上に置かなくて良いはず。
パレットの情報とLZWの辞書だけメモリ上に持つ省メモリなGIFデコーダを探したけど、意外と良いのが無い。。
http://www.technoblogy.com/show?45YI
これが一番良さそうに見えたのだけど、GitHubのリポジトリのコード見るとあまりちゃんと動かなそう。
とりあえず自分で書いてみて、どんなサイズのGIFでも16kB+αのメモリがあれば動きそうになった。実装も120行くらい。ピクセルの書き込み順を入れ替えて良ければさらに減るけど、悩ましい。
実装してて思い出したけど、20年くらい前にもJavaでGIFファイルのパーサ書いてるな。。。docomoのガラケーのAPIが画像以外のファイル操作を頑なに受け付けないので、仕方なくGIFのコメントブロック内にファイルシステム作っていた思い出。