アルファブレンドをする
いくつかまとめているところがあったので、これを読めば実装はできる。
今度他の実装をするかもしれないので、リンクをメモしとく。
各種合成方法について
http://tobysoft.net/wiki/index.php?PhotoShop%2F%A5%EC%A5%A4%A5%E4%A1%BC%A4%CE%B7%D7%BB%BB%CA%FD%CB%A1%A4%CB%A4%C4%A4%A4%A4%C6
http://ofo.jp/osakana/cgtips/blendmode.phtml
最適化について
SSEとか使っていくと、どんどん早くなる模様。並列化もできるコードなのでboostを使って、配列を分割して処理したら早いんじゃないかなと思ってるが、まだ試していない。
http://gir-lab.spaces.live.com/Blog/cns!63A4C32EDA5CF2F7!763.entry
http://ray.sakura.ne.jp/asm/link.html
OpenCVでやってみる
IplImage *srcImg = cvLoadImage( "test1.jpg" ); IplImage *targetImg = cvLoadImage( "test2.jpg" ); IplImage *maskImg = cvLoadImage( "mask.jpg" ); unsigned long length = srcImg->height * srcImg->widthStep; for( unsigned long i=0; i<length; ++i ){ resultImg->imageData[i] = ((unsigned char)srcImg->imageData[i]*(255-maskImg->imageData[i]) + (unsigned char)targetImg->imageData[i]*(unsigned char)maskImg->imageData[i])/255; }
こんな感じに実際やってみた。わざと3チャンネルのマスクにしておいて、特定の色だけ抜くとかできるようにやっている。
こんな短いコードなのにすごく何時間も無駄にしていて、OpenCVのimageDataはcharの配列なので、unsigned charにしてやらないと負の値の色のときに計算ができなくなり(半分の色で)おかしな結果が出てしまう。
こういう計算をするときはちゃんとキャストとかも気をつけないといけないんだなと教訓を得た。
cppなのでstatic_castで書くべきか悩んであげく、面倒でやってないというのは気にしない方向で。