2006/06/29(木) [n年前の日記]
#2 [iappli] モザイクとかディザとか
数日前の話。メモするのを忘れてたのでここにメモ。
◎ モザイク。 :
ふと。getRGBPixel() と fillRect() を使うとモザイク処理ができるなと閃いた。ステージクリア時の画面を表示をするところに入れてみた。それっぽい。SFCライク。MDではこんなこと容易にできなかったから、なんだか嬉しい。でも、機種によって処理速度が違うかもしれないと気づいた。この期に及んでバグ報告が増えるのは困る。ということで封印。いつかどこかで使いたいなぁ…。
◎ ディザ。 :
ディザで画面を擬似フェードインできないかなと。半透明 fill ができる機種なら、速度は別にしてフェードインも容易なのだろうけど。DoJa 3.0 では標準ではない・仮にあったとしてもオプションだろうし。ということで昔風にディザを使ってできないものかと。
学生の頃に買った画像処理の書籍を見ながら、ディザの配列データを確認。配列データを元に、setRGBPixel() にどんな値を渡すか、それを求める方法が思い浮かばなくて悩む。どの座標を対象にするかを、(x,y) で持ってしまったらなんか無駄っぽいし。
そもそも、Image の中身に対して getRGBPixel() できないんじゃないかと気がついた。ダメじゃん。ドット単位で描いていけないじゃん。一旦描画してから埋めていく方法では、どう考えても処理速度的に厳しいだろうし。やはりドット単位で描いていかないと。getGraphics() ができれば getRGBPixel() も使えるだろうけど、getGraphics() は createImage() した Image に対してのみ利用可能とドキュメントにあったような…。
あらかじめ、ディザパターンになってるgifを持っておくのはどうか。透明色も指定して。それを画面に対して埋め尽くしていけば…。描画の処理速度が間に合わないか。BGチップで画面を埋め尽くすだけでも処理落ちしてたしなぁ。
createImage() した Image に、表示したい Image の一部を描き込んで、creatImage したほうの Image を毎フレームの描画に使うのはどうか。って、Image にたいして getRGBPixel() できないってさっき書いたばかりじゃん。…む。1dot だけの drawImage() ならどうか。…でも、16x16dotのディザパターンとしても、240x240 の Image に1dotずつ描いていくとなると、(240 / 16) x (240 /16) = 225回も drawImage() することになる。厳しい。フェードインするときだけフレームレートを落とすとか。
なんか色々と難しそう。諦めた。
ていうか。モザイク処理も、よくまあ動いてたな。さすがに 1dot の fillRect() で画面を埋めるのは無謀だと思ったから、最小 4dot ぐらいにして処理してたのだけど。それでも、1フレームに3600回ほど fillRect() してたはずで。…もしかして、fillRect() だけで画面を作ったら、それなりのFPSで作れたりするのだろうか。
あ。モザイクのソレって、エミュレータ上でだけ動作確認してたのだった。実機で動かしたら大変なことになってしまうのかもしれん。
学生の頃に買った画像処理の書籍を見ながら、ディザの配列データを確認。配列データを元に、setRGBPixel() にどんな値を渡すか、それを求める方法が思い浮かばなくて悩む。どの座標を対象にするかを、(x,y) で持ってしまったらなんか無駄っぽいし。
そもそも、Image の中身に対して getRGBPixel() できないんじゃないかと気がついた。ダメじゃん。ドット単位で描いていけないじゃん。一旦描画してから埋めていく方法では、どう考えても処理速度的に厳しいだろうし。やはりドット単位で描いていかないと。getGraphics() ができれば getRGBPixel() も使えるだろうけど、getGraphics() は createImage() した Image に対してのみ利用可能とドキュメントにあったような…。
あらかじめ、ディザパターンになってるgifを持っておくのはどうか。透明色も指定して。それを画面に対して埋め尽くしていけば…。描画の処理速度が間に合わないか。BGチップで画面を埋め尽くすだけでも処理落ちしてたしなぁ。
createImage() した Image に、表示したい Image の一部を描き込んで、creatImage したほうの Image を毎フレームの描画に使うのはどうか。って、Image にたいして getRGBPixel() できないってさっき書いたばかりじゃん。…む。1dot だけの drawImage() ならどうか。…でも、16x16dotのディザパターンとしても、240x240 の Image に1dotずつ描いていくとなると、(240 / 16) x (240 /16) = 225回も drawImage() することになる。厳しい。フェードインするときだけフレームレートを落とすとか。
なんか色々と難しそう。諦めた。
ていうか。モザイク処理も、よくまあ動いてたな。さすがに 1dot の fillRect() で画面を埋めるのは無謀だと思ったから、最小 4dot ぐらいにして処理してたのだけど。それでも、1フレームに3600回ほど fillRect() してたはずで。…もしかして、fillRect() だけで画面を作ったら、それなりのFPSで作れたりするのだろうか。
あ。モザイクのソレって、エミュレータ上でだけ動作確認してたのだった。実機で動かしたら大変なことになってしまうのかもしれん。
[ ツッコむ ]
以上です。