Ларчик просто открывался. Вместо этого
Код | if(mShadowImage.GetPixel(i, j) == Color.Black) bmp.SetPixel(i, j, mBackColor);
|
Надо было написать
Код | if(mShadowImage.GetPixel(i, j).ToArgb() == Color.Black.ToArgb()) bmp.SetPixel(i, j, mBackColor);
|
Еще улучшил попиксельную обработку в плане скорости. Класс декоратора нашел Google, а код я приложил к посту.
Код | public Bitmap DrawMaskedImage() { Bitmap bmp = new Bitmap(mMainImage.Width, mMainImage.Height); Graphics g = Graphics.FromImage(bmp); g.DrawImage(mMainImage, 0, 0); g.Dispose(); using(BitmapDecorator deco1 = new BitmapDecorator(bmp)) { using(BitmapDecorator deco2 = new BitmapDecorator(mShadowImage)) { for(int i=0; i<mMainImage.Width; i++) { for(int j=0; j<mMainImage.Height; j++) { if(deco2.GetPixel(i, j).ToArgb() == Color.Black.ToArgb()) deco1.SetPixel(i, j, mBackColor); } } } } return bmp; }
|
Смысл его использования зафиксировать Bitmap методом LockBits(), провести все попиксельные операции, уничтожить декораторы вызовом Dispose(), в котором прописан UnlockBits(). Реально ускоряет попиксельную обработку достаточно больших растров. Проблему, на мой взгляд, можно считать решенной. |