誰でもスーラ ~点描派風ピクセレート・ウェブカム編~
2010/03/26 21:06 - AS3.0
先日「Beyond Interaction ―メディアアートのためのopenFrameworksプログラミング入門」に掲載されていたサンプルに触発されて、FileReference で読み込んだ画像ファイルを網点風に変換する作品を wonderfl に投稿しました。
今回は、それをウェブカムに適用したものを wonderfl に投稿しましたよ。 題して「誰でもスーラ」。
コンセプトは同じでも、静止画像とウェブカメラではまったくアルゴリズムが変わってしまったという話。
ウェブカム仕様となるとけっこうな処理速度が求められるわけですが、「何でもスーラ」のアルゴリズムでは遅くて遅くてお話しにならん状態でした。
BitmapData のメソッドの速度とか、あまりシビアに考えたことなかったんで、今回いろいろ学ぶことになったのは良い経験になったかもです。
一つの Rectangle や BitmapData を何度も何度も使いまわしたり(これは以前からそれなりにおこなっていたこと)、BitmapData.draw の代わりに BitmapData.copyPixels 使ったり。
前回のアルゴリズムでは、赤い点、緑の点、青の点は Sprite を継承したクラスとして設計しました。BlendMode.ADD を設定し、カンバスに addChild することで加法混色を実装していたんです。
以前、Sprite で描画するよりも BitmapData で描画するほうが速いというのを読んだ記憶がありまして、Graphics 系を完全に廃して全て BitmapData が持つメソッドだけ描画すれば、それなりの高速化が見込めるだろうと、いろいろ調べてみました。
BitmapData.draw は、ブレンドモードを引数として取ることができるけど、draw は copyPixels に切り替え済み。そして copyPixels はブレンドモード操作ができない。
どうしたらよかんべい、といろいろ試してみたら、copyChannels であっさり解決しちゃいました。 やっぱいろいろ試してみるもんですね。
付け焼刃なので、まだまだ調整が甘い部分があるかもしれませんが、今の私の実力ではここまでってことで。 もっと速くする手法があったら、ぜひともご教授賜りたく。
今作品のコードのキモは HalftoneColor クラスとしてまとめてあります。