最近在写一个图像处理的程序。被各种各样的DC和位图折磨了2个星期。现在总结一些在PocketPC下如何处理一副位图,并将位图透明达到处理背景的目的。
首先我们先要清楚几个概念:
1、DC:概念上的定义前面有详细的解释,这里呢,我们就形象的把他看做是系统提供给我们的画板。
2、设备DC和内存DC:内存DC中的位图只有BitBlt到设备DC中才能显示图像。
3、一个DC(包括设备DC和内存DC)可以创建多个内存DC,每个子内存DC都占据父DC的一块区域,相当于把一个大的画板分隔成一份份的,这样我们可以分别地操作各个子DC处理完了在把他们组装到一起,这就好比我们在做拼图。
4、颜色的表示:我们的像素是用RGB表示的。其中白色RGB(255,255,255)及全1,黑色RGB(0,0,0)及全0.
5、由于位图是按块存储的,所以所有的位图都是方方正正的,不可能出现不规则形状的位图。
清楚了这几个概念我们可以来去除位图的背景了
今天我们要处理的是下面两张位图pic_1和pic_2
+
=
(pic_1) (pic_2) (pic_3)
我们要将pic_2的白色背景去除,把它贴到草地上,实现pic_3的效果。
背景去除分为以下几个步骤:
(一)准备两张位图,一张背景位图,一张图像位图。
(二)创建两个内存DC,分别载入背景位图和要显示的图像位图。
hBackGroundDC = createCompatibleDC(MainDC);
hPicDC = createCompatibleDC(MainDC);
oldBackGroundBmp = selectObject(hBackGroundDC,backGroundBmp);
oldPicBmp = selectObject(hPicDC,picBmp);
(三)再创建两个内存DC,分别作为背景的遮罩层(遮罩位图),和图像的遮罩层(遮罩位图Pic_5)。
(Pic_5)
(四)将背景遮罩DC和背景DC进行或操作,图像遮罩DC和图像DC进行或操作,生成新的位图
(Pic_8)
(五)将Pic_7和Pic_8进行与操作,得到去除了背景的位图。将最终的位图BitBlt到设备DC中现实。
这样去除了背景的太阳就成功显示到了显示器上