-

       最近在写一个图像处理的程序。被各种各样的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中现实。

        这样去除了背景的太阳就成功显示到了显示器上

posted on 2008-12-21 22:04  Ruby_Wang  阅读(671)  评论(1编辑  收藏  举报