▽ビットマップ合成

各種画像合成の実験です。

ソースコードはこちら。

sk04-02.lzh
sk04-02.lzh

skLib ver 1.0 [062]
sklib-062.lzh

サンプルプログラムはskLibを使用しています。ソースコードをコンパイルする際はあらかじめ、skLibの環境を整えておいてください。

sk04
動作中の画面

ツールバーで画像の転送に関する引数を設定できます。細かい内容は・・・ ソースを参考と言うことで。

○解説

ビットマップの合成を行っているのがskBitmapDCExクラスです。しかし・・・ もうちょっと良い名前がないかなぁ。しばらく考えよう。

合成に関してはα合成/透明色指定合成/add合成とよく使いそうな物を実装してありますが思い切った最適化はしていません

アルゴリズムレベルでも2倍・・・ MMXを使えば最低でも4倍ぐらいは高速化できそうですけど、まぁ、そこまでするぐらいならDirectXなりOpenGLなりを使った方が速いでしょう。

以下、各アルゴリズムの具体的な解説を。

○32bitビットマップ・α合成

32bitビットマップの場合、ピクセルごとにα情報を持ちますが同時に合成用に全体のαも指定することが出来ます。

	aa:全体に適用するα
	sa:転送元ピクセルのα
	sc:転送元ピクセルの色
	dc:転送先ピクセルの色

	ta = aa * sa

	c0 = sc * ta
	c1 = dc * ( 1.0 - ta )
	dc = c0 + c1

 つまり、簡単に言うと二つのαを合成して、そのαで転送元と転送先を合成してるだけです。

○24bitビットマップ・α合成

24bitビットマップの場合、αは全体で一つだけ指定します。また、透明色の指定があれば透明色も有効となります。

	aa:全体に適用するα
	sc:転送元ピクセルの色
	dc:転送先ピクセルの色

	※透明色以外のピクセルだけ以下の処理を行う

	c0 = sc * aa
	c1 = dc * ( 1.0 - aa )
	dc = c0 + c1

 つまり、簡単に言うと二つのαを合成して、そのαで転送元と転送先を合成してるだけです。

○透明色指定合成

ピクセル単位で色を調べて、透明色以外を転送するだけです。

○add合成

転送元の色と転送先の色を足しあわせる合成です。

	sc:転送元ピクセルの色
	dc:転送先ピクセルの色

	※透明色以外のピクセルだけ以下の処理を行う

	dc = dc + sc

同様にsub合成・mul合成も実装してありますが・・・ これを使うことはないだろうなぁ。たぶん。

○font合成

グレイスケールのデータを指定された色に変換しながら合成する処理です。色を変えながらフォント用のデータを描画するときに使えます。たぶん。

    cc:フォントの描画色
    sc:転送元ピクセルの色
    dc:転送先ピクセルの色

    dc  = sc * cc + dc * ( 1.0 - sc )

○今後の予定

合成のアイデアは他にもいろいろあるんですけどいろいろありすぎるんで省略。たとえばカラー情報とα情報を別々に指定するパターンとか。高速化についてもやれば出来るんですけど・・・ まぁ、面倒なんで省略で。

基本的なところは出来たんで、これを使って前から欲しかったPNGの編集ソフトを作る予定。


[skLib] Presented by See.Ku [2005/7/7]