プチ画像処理について

http://d.hatena.ne.jp/yfp/20040517#p3経由で見たhttp://chaton.dip.jp/chaton/squeakについて、ちょっとBitBltお宅なのでもうちょっとSqueak的な解法を考えてみました。

教育的見地からは、http://chaton.dip.jp/chaton/squeakにあるようにループを自分で書くことによって、途中経過で出てくる画像の画素値を数字として調べる(inspectする)だけではなく、displayメッセージを送って画面に表示して、自分がやっていることを目で確かめられるという非常に強力な利点があります。

しかし、スピードという観点、およびオブジェクトの内部構造に頼らずに高いレベルでコードを書く、という観点からはBitBltを使わない手はありません。SqueakBitBltにはこれでもか、というくらいいろいろなコンビネーションルールがありますので、これを駆使すればいろんなことができます。

というわけで、ほぼ同様のことをするコードとしては、

srcForm dstForm tmpForm bb
srcForm := ((Form fromFileNamed: 'lenna.gif') asFormOfDepth: 32). [dstForm := Form extent: srcForm extent depth: 32. tmpForm := Form extent: srcForm extent depth: 32. bb := BitBlt current toForm: tmpForm. bb sourceForm: srcForm. bb combinationRule: 31. bb copyBitsTranslucent: (255.0 / 9.0) asInteger. ({0@0}, (0@0) eightNeighbors) do: [:p | bb := BitBlt current toForm: dstForm. bb sourceForm: tmpForm. bb destOrigin: p. bb sourceOrigin: 0@0. bb combinationRule: 20. bb copyBits. ]. dstForm asGrayScale asMorph openInWorld. ] timeToRun

というものがありうるでしょう。rule=31によって、約1/9に暗くしたものをまず作っておき、partitionAddであるrule 20によって、"neighbors"および自分自身を足していっています。

必要以上に遅い処理であるGIFファイルの読み込み部分を除くと、オリジナルに比べて大体30倍くらい高速化されています。

というわけで、BitBltでも遊んでみてください。