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预乘的

最后就是上面代码的效果,正弦的透明渐进效果




0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 在天猫超市买东西订单关闭了怎么办 淘宝上退货店家收到货不理怎么办 淘宝申请退货退款卖家拒绝怎么办 闲鱼退货卖家拒绝退款怎么办 淘宝退货店家收到货不退款怎么办 卖家拒绝申请我退货了怎么办 衣服洗了卖家拒绝退货怎么办 在京东买的小米手机屏摔碎了怎么办 取消流量漫游后省内不限量怎么办 在淘宝买东西不发货也不退款怎么办 微信上充值电话号码空号怎么办 支付宝转帐到已停机的号码上怎么办 支付宝充话费充错号码怎么办 支付宝话费充错号码了怎么办 村书记打了人不给赔偿药费怎么办 淘宝退给的支付的钱怎么办 淘宝支付了钱没回信息怎么办 微信话费充值暂时缺货怎么办 天猫过敏无忧不给退款怎么办 顺丰快递指定丰巢柜发现柜满怎么办 阿里购物申请退款过期末退怎么办 韵达签收了发现里面东西丢了怎么办 没有收到快递但是显示签收了怎么办 支付宝充话费显示商家未发货怎么办 快递被买家签收后调包了怎么办 快递买家签收了东西坏了怎么办 快递没签收到买家评价了怎么办 快递买家签收后现在要退货怎么办 支付宝充话费充错对方关机怎么办 闲鱼同意退款了买家不退东西怎么办 被骗了说给存q币怎么办 方正说我的淘宝字体侵权怎么办 买家说收到衣服没有吊牌该怎么办 淘宝下完订单店主不发货怎么办 工商局不给查被告企业的信息怎么办 被职业打假人起诉到法院怎么办 京东购物如果换货不给你发货怎么办 淘宝上发的快递没有了怎么办 天猫购物半个月不发货怎么办 京东网同一产品购买多规格的怎么办 天猫商城购买的家具要退换货怎么办