DIB位图alpha通道问题
来源:互联网 发布:大数据安全管理办法 编辑:程序博客网 时间:2024/04/26 20:15
前段时间研究三角函数在图像处理的应用,要实现的是一个三角函数方式的渐进透明度,但是实现中出现的一个问题非常不解,就是设置像素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通道问题
- 自定义RGB位图使用Alpha通道处理透明效果
- Alpha通道
- alpha通道
- GDI位图和DIB位图
- 设备无关位图(DIB)
- 设备无关位图 DIB
- [原]BMP位图 转换 透明 TGA图像 - 增加 alpha通道 -TGA文件格式初解
- 使用Win32/MFC实现Splash窗口(含有alpha通道的位图窗口)
- 什么是Alpha通道(Alpha Channel)
- DIB--设备无关位图文件
- 将DIB位图写入位图文件
- 转载-Alpha通道实现
- 图片的alpha 通道
- DirectX11 Alpha通道
- 图像中Alpha通道
- 提取图像Alpha位图
- GDI位图和DIB位图是两种不同的Windows位图
- JS数组的遍历方式for循环与for...in
- mybatis的<if test> 条件判断
- jquery File Upload 插件应用之解析返回json对象
- Java Socket重要参数讲解
- 根据IP定位所在城市(HTML,js,新浪IP地址库)
- DIB位图alpha通道问题
- 并发与并行
- 在天涯、猫眼关于读经和汉服的论战
- hadoop权威指南读书总结
- hihocoder 1238 实时查询树的所有节点对距离和
- 太监式爱国 —— 忠君爱国主义(转载)
- 机器学习算法之六:5分钟上手Logistic Regression
- 爬虫的基础邹形
- 学习笔记之——自定义Dialog仿ios弹出底部菜单