我正在編輯一些使用GDI +的舊GDI代碼,並且在繪製具有透明背景的BMP文件時遇到了問題。舊的GDI代碼沒有使用任何明顯的額外代碼來繪製背景透明,所以我想知道如何使用GDI +實現這一點。如何使用GDI繪製透明BMP +
我當前的代碼看起來像這樣
HINSTANCE hinstance = GetModuleHandle(NULL);
bmp = Gdiplus::Bitmap::FromResource(hinstance, MAKEINTRESOURCEW(IDB_BMP));
Gdiplus::Graphics graphics(pDC->m_hDC);
graphics.DrawImage(&bmp, posX, posY);
我也試圖通過克隆方法,並通過繪製位圖到新創建的一個創造,從資源的新位圖,但也沒有幫助。兩次我使用PixelFormat32bppPARGB。
然後我試圖使用alpha混合,但這種方式,整個圖像變得透明,不僅背景:
Gdiplus::ColorMatrix clrMatrix = {
1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.5f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f, 1.0f
};
Gdiplus::ImageAttributes imgAttr;
imgAttr.SetColorMatrix(&clrMatrix);
graphics.DrawImage(&bmp, destRect, 0, 0, width(), height(), Gdiplus::UnitPixel, &imgAttr);
透明度信息已包含在圖像中,但我沒有線索如何在繪製圖像時應用它。如何實現這一目標?
好吧,這似乎真的舊的GDI能夠在沒有任何額外的代碼的情況下繪製這樣的圖像,而新的GDI +無法做同樣的工作,而不需要額外的繁重的工作......悲傷但真實 – sigy 2012-07-30 09:01:25
正如答案所示,GDI + *可以做到這一點,只需使用支持Alpha通道的圖像格式(如PNG)即可。 [我毫不懷疑你*可以將alpha數據存儲在BMP文件中,但你不應該這樣做。這不正常。如果它有效,它會因爲GDI中的錯誤而起作用,並且你不應該依賴它。] – BrainSlugs83 2015-01-13 13:28:18