日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

绘制“透明”位图

發布時間:2025/3/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 绘制“透明”位图 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
繪制“透明”位圖是指繪制某一位圖中除指定顏色外的其余部分,我們稱這種顏色為“透明色”。通過將位圖的背景色指定為“透明色”,在繪制時,不繪制這部分背景,而僅繪制圖像,這樣就可以將位圖中圖像透明地繪制到窗口上。

  繪制“透明”位圖的關鍵是創建一個“掩碼”位圖(mask bitmap),“掩碼”位圖是一個單色位圖,它是位圖中圖像的一個單色剪影。

  在Windows編程中,繪圖都要用到設備描述表,我們需創建兩個內存設備描述表:位圖設備描述表(image DC)和“掩碼”位圖設備描述表(mask DC)。位圖設備描述表用來裝入位圖,而“掩碼”位圖設備描述表用來裝入“掩碼”位圖。在“掩碼”位圖設備描述表中制作“掩碼”位圖的方式是:先創建一個單色的Bitmap,裝入mask DC,然后,以“SRCCOPY”的方式將裝有位圖的位圖設備描述表繪制(BitBlt)到mask DC上。這樣,mask DC的顯示平面中的位圖即是“掩碼”位圖。

  繪制“透明”位圖的實際操作步驟:

  1.將位圖設備描述表以“SRCINVERT”的方式繪制(BitBlt)到顯示設備描述表上;

  2.將“掩碼”位圖設備描述表以“SRCAND”的方式繪制(BitBlt)到顯示設備描述表上;

  3.再將位圖設備描述表以“SRCINVERT”的方式繪制(BitBlt)到顯示設備描述表上。這樣除“透明色”外的其余位圖部分(圖像部分)就被繪制到窗口上了。

  實現代碼如下:

  void DrawTransparent(CDC * pDC, int x, int y, COLORREF crColour)

  { COLORREF crOldBack=pDC-〉SetBkColor(RGB(255,255,255));

   COLORREF crOldText=pDC-〉SetTextColor(RGB(0,0,0));

   CDC dcImage, dcMask;

   CBitmap bmp;

   bmp.LoadBitmap(IDB—TRANS);

  //IDB—TRANS是待顯示位圖的資源ID

   BITMAP bm;bmp.GetBitmap(&bm);

   int nWidth=bm.bmWidth,nHeight=bm.bmHeight;

  //為圖像及mask各創建一個DC

   dcImage.CreateCompatibleDC(pDC);

   dcMask.CreateCompatibleDC(pDC);

  //把圖像裝入image DC

   CBitmap* pOldBitmapImage=dcImage.SelectObject(&bmp);

  //為“掩碼”位圖創建一個單色bitmap

   CBitmap bitmapMask;

   bitmapMask.CreateBitmap(nWidth, nHeight, 1, 1, NULL); //把mask位圖裝入mask DC

   CBitmap* pOldBitmapMask = dcMask.SelectObject(&bitmapMask); //用透明色創建“掩碼”位圖

  dcImage.SetBkColor(crColour);//crColor是位圖中的透明色

   dcMask.BitBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0, SRCCOPY);//分3步進行實際的繪制

   pDC-〉BitBlt(x, y, nWidth, nHeight, &dcImage, 0, 0, SRCINVERT);

   pDC-〉BitBlt(x, y, nWidth, nHeight, &dcMask, 0, 0, SRCAND);

   pDC-〉BitBlt(x, y, nWidth, nHeight, &dcImage, 0, 0, SRCINVERT); //恢復原先設置

   dcImage.SelectObject(pOldBitmapImage);

   dcMask.SelectObject(pOldBitmapMask);

   pDC-〉SetBkColor(crOldBack);

   pDC-〉SetTextColor(crOldText);}

  以上這種“透明”位圖的繪制方法,還可以用到動畫技術中,如繪制在某場景中不斷移動的人物或動物,就可以通過將人物或動物位圖“透明”地繪制到背景中實現。

總結

以上是生活随笔為你收集整理的绘制“透明”位图的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。