原文出处:http://blog.youkuaiyun.com/ThomasLiu83/archive/2005/08/01/443385.aspx
透明和不透明:
透明象素是那些不会影响目标文件的象素,看不见的象素;不透明象素就是将会出现在目标文件上覆盖原来位置的点的象素。
白色和黑色: 分别被假定为全1和全0的值
基本的操作:BitBlt 涉及到从源文件到目标文件的块传递,另外也有单色和彩色位图 之间的转换。
单色和彩色位图之间的转换: 从单色位图到彩色位图,单色位图中是1的地方需要先转换为彩色位图的背景色,全0的地方需要转换为前景色,然后在进行块间操作;从彩色位图到单色位图,彩色位图中所有和背景色一致的地方设置为全1,即白色,其余部分为0,黑色,然后操作。
(原文:When using BitBlt() to convert a monochrome bitmap to a color bitmap, GDI transforms all white bits (1) to the background color of the destination device context (DC). GDI transforms all black bits (0) to the text (or foreground) color of the destination DC. When using BitBlt() to convert a color bitmap to a monochrome bitmap, GDI sets to white (1) all pixels that match the background color of the source DC. All other bits are set to black (0).)
光栅操作:
BitBlt函数的最后一个参数指定了一个光栅操作(ROP),它明确定义了如何将源文件、目标文件和模式(由现在选出的刷子画笔定义)的位组合去形成一 个目标文件。因为一个位图只是一个位值的集合,光栅操作(ROP)只是一个在位上操作的布尔等式。相应使用的设备,位图中的代表不同的事物。
在多色设备上,每个象素由一个位集合代表,他们要么形成一个指向颜色的索引,要么直接代表一种颜色。
在单色设备上,每个象素由一个位来代表,0表示黑色并且1代表白色。
对于所有的设备类型,光栅操作(ROP)只简单地在位展示上进行而不考虑他们的实际意义。
SRCCOPY | src | 直接将源拷到目的地 |
SRCAND | src and dest | 将目标文件中对应于源文件黑色区域的部分变黑,将对应于白色区域的部分留着不动 |
SRCINVERT | src XOR dest | 将源插入到目标。二次使用时,将目标恢复到它原来的状态。在某种条件下可以代替SRCPAINT 操作 |
SRCPAINT | src OR dest | 将源文件中的非白色区域刷到目标文件中。源中的黑色区域不转换到目标中。 |
主要介绍的光栅操作: SRCINVERT实现异或操作,两次异或操作相同于还原,例如1与1异或为0,0再与1异或结果还为1,回到之前的值。
使用举例:
- /* 自绘制透明位图的函数 */
- BOOL DrawTransparentBmp( HDC hdcDest,
- int nXOriginDest,
- int nYOriginDest,
- int nWidthDest,
- int nHeightDest,
- HDC hdcSrc,
- int nXOriginSrc,
- int nYOriginSrc,
- int nWidthSrc,
- int nHeightSrc,
- UINT crTransparent)
- {
- if (nWidthDest < 1)
- {
- return false ;
- }
- if (nWidthSrc < 1)
- {
- return false ;
- }
- if (nHeightDest < 1)
- {
- return false ;
- }
- if (nHeightSrc < 1)
- {
- return false ;
- }
- HDC hMaskDC,hImageDC;
- HBITMAP hMaskBitmap,hOldMaskBitmap;
- HBITMAP hImageBitmap,hOldImageBitmap;
- //创建mask DC 和临时存源文件的 DC
- hMaskDC = CreateCompatibleDC(hdcDest);
- hImageDC = CreateCompatibleDC(hdcDest);
- //创建mask 位图和image 兼容位图
- hMaskBitmap = CreateBitmap(nWidthSrc,nHeightSrc,1,1,NULL); //单色位图
- hImageBitmap = CreateCompatibleBitmap(hdcDest,nWidthSrc,nHeightSrc); //彩色位图
- //将位图选进DC中
- hOldImageBitmap = ( HBITMAP )SelectObject(hImageDC,hImageBitmap);
- hOldMaskBitmap = ( HBITMAP )SelectObject(hMaskDC,hMaskBitmap);
- //将src位图拷入临时的image DC中
- if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
- {
- BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,
- hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
- }
- else
- {
- StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc,
- nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);
- }
- //设置整个需要透明的颜色
- SetBkColor(hImageDC,crTransparent);
- //此步生成掩码位图(mask bitmap),注意整个位图中白为1,黑为0
- //整个mask 位图中透明色的地方是白色,其他为黑色
- BitBlt(hMaskDC, 0, 0, nWidthSrc, nHeightSrc,
- hImageDC, nXOriginSrc, nYOriginSrc, SRCCOPY);
- SetBkColor(hdcDest, RGB(255, 255, 255));
- SetTextColor(hdcDest, RGB(0, 0, 0));
- BitBlt(hdcDest, nXOriginDest, nYOriginDest,
- nWidthSrc, nHeightDest, hImageDC, nXOriginSrc, nYOriginSrc, SRCINVERT);
- BitBlt(hdcDest, nXOriginDest, nYOriginDest,
- nWidthSrc, nHeightDest, hMaskDC, 0, 0, SRCAND);
- BitBlt(hdcDest, nXOriginDest, nYOriginDest,
- nWidthSrc, nHeightDest, hImageDC, nXOriginSrc, nYOriginSrc, SRCINVERT);
- return true ;
- }