上面转载是讲解单色图中SetBkColor和SetTextColor函数对单色图的影响。我想在这对其进行解释下.
A
在A中生成掩码图时,将SetBkColor设置成红色,是说明将图COPY的时候红色将会生成白色。我们要明白在单色图中只有RGB(255,255,255)是白色,其余任何颜色都是黑色即RGB(0,0,0),SetBkColor(255,0,0); 是SRCCOPY字段转换时生成的单色图中只有RGB(255,0,0)红色的时候为白色。
情况1:
在没有SetBkColor时
MaskDC.BitBlt( 0,0, imgInfo.bmWidth, imgInfo.bmHeight, &ImageDC, 0,0,SRCCOPY); // ImageDC关联的是上图
pDC->BitBlt(0,0,imgInfo.bmWidth, imgInfo.bmHeight, &ImageDC, 0, 0, SRCCOPY); // MaskDC关联的是下图
pDC->BitBlt(0,200,imgInfo.bmWidth, imgInfo.bmHeight, &MaskDC, 0, 0, SRCCOPY);
结果
情况2:SetBkColor的情况
ImageDC.SetBkColor(RGB(255,0,0)); //设置红色在单色图中显示白色.
MaskDC.BitBlt( 0,0, imgInfo.bmWidth, imgInfo.bmHeight, &ImageDC, 0,0,SRCCOPY); // ImageDC关联的是上图
pDC->BitBlt(0,0,imgInfo.bmWidth, imgInfo.bmHeight, &ImageDC, 0, 0, SRCCOPY); // MaskDC关联的是下图
pDC->BitBlt(0,200,imgInfo.bmWidth, imgInfo.bmHeight, &MaskDC, 0, 0, SRCCOPY);
结果:
这些事在SRCCOPY的情况下 SRCAND或其他情况下对MaskDC待补充
B中情况
ImageDC.SetBkColor(RGB(255,0,0));
// MaskDC.SetBkColor(RGB(255,255,255));
// MaskDC.SetBkColor(RGB(255,255,255));
pDC->BitBlt(0,0,imgInfo.bmWidth, imgInfo.bmHeight, &ImageDC, 0, 0,SRCCOPY);
MaskDC.BitBlt( 0,0, imgInfo.bmWidth, imgInfo.bmHeight, &ImageDC, 0,0,SRCCOPY);
ImageDC.SetBkColor(RGB(0,0,0));
ImageDC.SetTextColor(RGB(255,0,0)); // 与黑色的区域与
ImageDC.BitBlt(0,0,imgInfo.bmWidth, imgInfo.bmHeight, &MaskDC, 0, 0, SRCAND);
pDC->BitBlt(0,200,imgInfo.bmWidth, imgInfo.bmHeight, &MaskDC, 0, 0, SRCCOPY);
pDC->BitBlt(0,300,imgInfo.bmWidth, imgInfo.bmHeight, &ImageDC, 0, 0, SRCCOPY);
结果:
f
掩码图并不参与AND或OR计算,他只是定位ImageDC图中的AND或OR的图片位置.
黑色图片在ImageDC中对应的图片和SetTextColor中的RGB(255,0,0)进行与运算
白色图片在ImageDC中对应的图片和SetBkColor中的RGB(0,0,0)进行与运算
下面我们将掩码图片的颜色将换后看看得出的结果与我们的理论是否相符.
ImageDC.SetBkColor(RGB(255,0,0));
// MaskDC.SetBkColor(RGB(255,255,255));
// MaskDC.SetBkColor(RGB(255,255,255));
pDC->BitBlt(0,0,imgInfo.bmWidth, imgInfo.bmHeight, &ImageDC, 0, 0,SRCCOPY);
MaskDC.BitBlt( 0,0, imgInfo.bmWidth, imgInfo.bmHeight, &ImageDC, 0,0,NOTSRCCOPY);
ImageDC.SetBkColor(RGB(0,0,0));
ImageDC.SetTextColor(RGB(255,0,0)); // 与黑色的区域与
ImageDC.BitBlt(0,0,imgInfo.bmWidth, imgInfo.bmHeight, &MaskDC, 0, 0, SRCAND);
pDC->BitBlt(0,200,imgInfo.bmWidth, imgInfo.bmHeight, &MaskDC, 0, 0, SRCCOPY);
pDC->BitBlt(0,300,imgInfo.bmWidth, imgInfo.bmHeight, &ImageDC, 0, 0, SRCCOPY);
验证了我们上面所说的结论.在这里我们只是了解了怎么用就可以,其中具体BitBlt和SetBkColor是怎么个原理估计只有看了源码才能明白。