如何在一個背景圖像上,做半透明的圖?
熱心網友
你可以參考一下下面的代碼 這段代碼就是創建一個半透明的位圖: 其中的主要函數有 GetBitmapBits(); SetBitmapBits() 由于位圖文件中的點是又紅綠藍三種顏色組成,所以位圖文件在內存中的存儲格式如下: gbr gbr gbr gbr 。。。。。。。。。。。。。。 。。。。。。。。。。。。。。 從上面可以看出,每個點占3x1個像素,而且順序是按gbr的順序排列的,設置圖象透明其實就是設置每個點的透明度,好好看看下面的代碼吧!我想應該對你有幫助! BITMAP bm; int x,y,s,t,m,i=0; GetClientRect(&rect); mdc = new CDC; bitmap = new CBitmap; bgbmp = new CBitmap; mdc-CreateCompatibleDC(dc); bgbmp-m_hObject = (HBITMAP)::LoadImage(NULL," p",IMAGE_BITMAP,rect。right, ttom,LR_LOADFROMFILE); bitmap-m_hObject = (HBITMAP)::LoadImage(NULL," p",IMAGE_BITMAP,298,329,LR_LOADFROMFILE); bitmap-GetObject(sizeof(BITMAP),&bm); unsigned char *px = new unsigned char[ Height* WidthBytes]; bitmap-GetBitmapBits( Height* WidthBytes,px); s = Height; t = Width; m = WidthBytes; for(y=0;ySetBitmapBits( Height* WidthBytes,px); bgbmp-GetObject(sizeof(BITMAP),&bm); unsigned char *py = new unsigned char[ Height* WidthBytes]; bgbmp-GetBitmapBits( Height* WidthBytes,py); for(y=100;ySetBitmapBits( Height* WidthBytes,py); mdc-SelectObject(bgbmp); delete []px;//刪除數組一定要用這種形式 delete []py; 。
熱心網友
『Alpha-Blending』 所謂 Alpha-Blending,其實就是按照“Alpha”混合向量的值來混合源像素和目標像素,一般用來處理半透明效果。 Alpha-Blending 技術并簡單介紹 Alpha-Blending 技術的具體算法。 所謂 Alpha-Blending,其實就是按照“Alpha”混合向量的值來混合源像素和目標像素。為了便于理解,我們就從兩個像素間的 Alpha-Blending 過程談起吧。 第一步,先把源像素和目標像素的 RGB 三個顏色分量分離,然后把源像素的三個顏色分量分別乘上 Alpha 的值,并把目標像素的三個顏色分量分別乘上 Alpha 的反值,接下來把結果按對應顏色分量相加,再對最后求得的每個分量結果除以 Alpha 的最大值(通常這一步都是用移位來完成,這亦是 Alpha 的最大值為何總是二的冪的原因),最后把三個顏色分量重新合成為一個像素輸出。 在這個過程中,為了分離像素中的 RGB 三個顏色分量,我們一般會使用掩膜的方法。至于具體的三個掩膜值:RMask、GMask 和 BMask,可以從 DirectDraw 中的 DDPixelFormat 返回得到(當然,你也可以根據自己的需要做各種靈活處理)。 在下面給出的說明性例程中,我們假設 RMask、GMask 和 BMask 已經存放的是 RGB 三個顏色分量的位掩膜值,Alpha 的最大值為 256,而 source 和 dest 是指向源像素和目標像素的指針。 int ialpha = 256 - *alpha; // Alpha 的反值 *dest = (RMask & (((*source & RMask) * *alpha + (*dest & RMask) * ialpha) 8)) ¦ (GMask & (((*source & GMask) * *alpha + (*dest & GMask) * ialpha) 8)) ¦ (BMask & (((*source & BMask) * *alpha + (*dest & BMask) * ialpha) 8)); 。