DIB位图alpha通道问题
前段時間研究三角函數在圖像處理的應用,要實現的是一個三角函數方式的漸進透明度,但是實現中出現的一個問題非常不解,就是設置像素alpha通道沒有效果的問題。
首先貼上代碼
void OnPaint(HWND hWnd)
{
?? ?RECT rc;
?? ?GetClientRect(hWnd, &rc);
?? ?
?? ?int width = 180;
?? ?int height = 100;
?? ?int left = (rc.right - rc.left - width)/2;
?? ?int top = (rc.bottom - rc.top-height)/2;
?? ?HDC hDC = GetDC(hWnd);
?? ?SaveDC(hDC);
?? ?HBRUSH br = CreateSolidBrush(RGB(0,0,0));
?? ?SelectObject(hDC, br);
?? ?FillRect(hDC, &rc, br);
?? ?HDC memDC = CreateCompatibleDC(hDC);
?? ?int x = 180;
?? ?int y = 2;
?? ?BITMAPINFO bmi;
?? ?memset(&bmi, 0, sizeof(BITMAPINFO));
?? ?bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
?? ?bmi.bmiHeader.biWidth = x;
?? ?bmi.bmiHeader.biHeight = y;
?? ?bmi.bmiHeader.biPlanes = 1;
?? ?bmi.bmiHeader.biBitCount = 32;
?? ?bmi.bmiHeader.biCompression = BI_RGB;
?? ?bmi.bmiHeader.biSizeImage = x*y*4;
?? ?bmi.bmiHeader.biClrUsed = 0;
?? ?LPBYTE pData = NULL;
?? ?HBITMAP dibmp = CreateDIBSection(hDC, &bmi, DIB_RGB_COLORS, (void**)&pData, NULL, 0);
?? ?if(dibmp && pData)
?? ?{
?? ??? ?for(int i = 0; i < x*y; ++i)
?? ??? ?{
?? ??? ??? ?float alpha = FastSin(i%x);
?? ??? ??? ?pData[i*4] = 255 * alpha;???????????????????? //b
?? ??? ??? ?pData[i*4+1] = 255 * alpha;??????????????? //g
?? ??? ??? ?pData[i*4+2] = 255 * alpha;??????????????? //r
?? ??? ??? ?pData[i*4+3] = 255 * alpha;??????????????? //alpha
?? ??? ?}
?? ?}
?? ?HBITMAP oldBmp = (HBITMAP)SelectObject(memDC, dibmp);
?? ?BLENDFUNCTION bf = {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA};
?? ?AlphaBlend(hDC, left, top, width, height, memDC, 0,0,x, y, bf);
?? ?SelectObject(memDC, oldBmp);
?? ?DeleteObject(dibmp);
?? ?RestoreDC(hDC, -1);
?? ?ReleaseDC(hWnd,hDC);
}
----------------------------------------------
一開始的代碼不是這樣的,而是下面這樣
?? ???? for(int i = 0; i < x*y; ++i)
?? ??? ?{
?? ??? ??? ?float alpha = FastSin(i%x);
?? ??? ??? ?pData[i*4] = 255;???????????????????? //b
?? ??? ??? ?pData[i*4+1] = 255;??????????????? //g
?? ??? ??? ?pData[i*4+2] = 255;??????????????? //r
?? ??? ??? ?pData[i*4+3] = 255 * alpha;??????????????? //alpha
?? ??? ?}
這樣無論alpha是多少,都沒有效果,后來我把背景換成白色
代碼改成
?? ???? for(int i = 0; i < x*y; ++i)
?? ??? ?{
?? ??? ??? ?float alpha = FastSin(i%x);
?? ??? ??? ?pData[i*4] = 0;???????????????????? //b
?? ??? ??? ?pData[i*4+1] = 0;??????????????? //g
?? ??? ??? ?pData[i*4+2] = 0;??????????????? //r
?? ??? ??? ?pData[i*4+3] = 255 * alpha;??????????????? //alpha
?? ??? ?}
發現有漸進效果,但是只要rgb設置了任何常數字都有問題,最后查找各種資料才明白原來dib位圖在gdi繪制時alpha通道要進行RGB預乘的
最后就是上面代碼的效果,正弦的透明漸進效果
總結
以上是生活随笔為你收集整理的DIB位图alpha通道问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于php的网上汽车销售系统
- 下一篇: 如何探索晶体管驱动负载