マイコン工作実験日記

Microcontroller を用いての工作、実験記録

画面キャプチャを取る

2013-12-07 14:57:50 | LCD
ブログ記事を書くのは夜になってしまうことが多いので、なかなか丁寧に写真を撮影する時間がとれません。とくにEVEのようにLCD画面を撮影した場合には室内照明の反射が入ってしまううえに、自分やカメラが映り込んでしまったりします。そこで、LPCcappucinnoでSDカードが使えるようになったのを機会に画面キャプチャを取得することにしました。

普通のLCDコントローラーであれば、フレームバッファのメモリ内容を読み出して適当なフォーマットでダンプしてやれば画面キャプチャを取得できます。ところがFT800にはフレームバッファが無いので、この方法は使えません。しかし、画面への出力内容をRAM_G空間に取り込むスナップショット機能がコマンドとして備わっています(CMD_SNAPSHOT)。このコマンドでいったんRAM_G空間に画面データを取得してから、RAM_Gの内容を読み出してSDカードに書き出すという2段階の手続きを経ることで画面キャプチャを取得することが可能です。RAM_G空間の大きさは256kBなので、ちょうどWQVGAの画面データを収用することができます。

そこで、実際にやってみました。

CMD_SNAMSHOTが取得するフォーマットはARGBが各4ビットというフォーマットになっています。色数が減ってしまうのがちょっと残念。AがあるのでPNGファイルに変換しておけばいいかと思い、libpngを使って簡単な変換プログラムを作成。その結果がコレです。



写真と違って、画像が鮮明になって気持ちいいですねぇ。実際の画面よりも綺麗だし。文字や図形を見てもアンチ・エイリアス処理が施されている効果が良く表れています。元データはARGB4444ですが、PNGファイル上ではcolor_typeとしてPNG_COLOR_TYPE_RGB_ALPHA を使う場合には、ビットの深さは8または16でなければならないようなので、RGBA8888に変換しています。

いい感じだったので、「EVE姐さんを回転しててみる」で生成した画面のキャプチャを取得してみようと思いました。が、これには大きな問題があることに気付きました。"EVE姐さん"の元画像はJPEGなのですが、これを展開した結果もまたRAM_G空間に保存されるのです。そして、残念なことにRAM_G空間はWQVGAの全画面をキャプチャすると、全て消費されてしまいます。CMD_SNAPSHOTではレジスタ設定により、キャプチャする画面サイズを指定することも可能ですので、メモリをやりくりすれば例えば画面の左上部分だけをキャプチャするといった妥協案は考えられます。でも、まぁ、ここはそんなことはせずに、わざとメモリ空間衝突させてみることにしました。



おぉ、どうやらメモリ内容が壊れていく途中の様子がキャプチャされているようです。ちなみにキャプチャが完了すると、もとももとEVE画像の入っていたメモリ領域はすべてキャプチャされたデータに置き換わってしまうので, 再度キャプチャを取り直すとこうなりました。