2015年12月21日

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

世間はすっかりクリスマス&スターウォーズに染まっていますね。
今週も週末は慌しく過ぎました。
今年は年末年始の休みも一週間しかなく、欲求不満が溜まりそうです。

今日は、PNGデコーダの実装に透過色を追加しました。

透過色は、「tRNS」チャンクで定義します。
中身は色ごとのアルファ値ですが、色の表現自体がカラーモードによって異なりますので、tRNSチャンクの中身もカラーモードによって異なります。
今回実装したのはインデックスカラーモードでの透過色だけです。
RGBモードでも、tRNSチャンクで色ごとにアルファ値を設定することができますが、まだ実装していません。

透過色の指定は圧縮・伸張とは関係が無く、描画時の処理がメインです。
デコーダライブラリではtRNSチャンクのデータの保持と参照を行います。
それを解釈して描画するのはデコーダライブラリを利用する側の仕事です。
今回はArduino上で描画する都合上、アルファ値の解釈は透明(0)・不透明(255)の2種類のみ行いました。

PNGに透過色を指定するツールとして、TweakPNGというツールを使いました。

【レビュー】PNG画像を解析して詳細なフォーマット情報を取得・表示するツール「TweakPNG」 - 窓の杜

このツールでPNGファイルを読み込み、tRNSチャンクを追加すると、透過色を指定することができます。

透過色ありPNGを表示させてみた様子が以下の動画です。
透過色対応させる場合は、高速なpushColorが使えませんので、少し遅くなりますが、透過色ピクセルを描画していないので見かけ上はそれほど遅くはなっていません。



この動画では、市松模様を表示してから、透過有りのPNGを表示させています。
市松模様を動画圧縮しているせいで、かなりひどい画質になっていますが・・・。
posted by boochow at 02:14| Comment(0) | ESP8266 | このブログの読者になる | 更新情報をチェックする

2015年12月14日

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


この週末はあまり時間が取れなかったのですが、このところ作っているPNGデコーダを、1bit/2bit/4bitのインデックスカラーに対応させてみました。

動画の通り、インデックスカラーはそれなりに高速に表示できます。
動画では、1bitの画像は表示させている画面がノイズのように見えますが、実は以前プチコン3号で作成した迷路の画像です。

このデコーダーの開発は、もっぱらVisual Studio上で行い、最後にArduino IDEで描画部分だけ追加しています。
やはり、少しプログラムが複雑になってくると、変数の状態を観察しながらステップ実行できる環境は欠かせないですね。
posted by boochow at 01:34| Comment(3) | ESP8266 | このブログの読者になる | 更新情報をチェックする

2015年12月09日

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


前回実装したPNGデコーダに、インデックスカラーモードとグレースケールモードの実装を追加してみました。
PNGの画像圧縮・伸長はバイト列が対象なので、カラーモードごとの違いはデコード結果のバイト列をどう解釈するかだけの違いです。

PNGはGIFより遅いなと思っていたのですが、インデックスカラーではそこそこの速度でした。
フルカラーだと1ピクセルあたり3バイトをデコードする必要がありますから、その場合は遅くなるのは当たり前でした。


ところで、先月末にESP8266用Arduinoがメジャーバージョンアップしていました。

esp8266/Arduino ・ GitHub

早速インストールしてみたのですが、なぜかILI9341ドライバが使えなくなっていたため、現在は古いバージョンに戻しています。
HTTPClient libraryが追加されたようなので、気になっているのですが・・・。
posted by boochow at 00:07| Comment(0) | ESP8266 | このブログの読者になる | 更新情報をチェックする
人気記事