MFC-AlphaBlend显示具有指定透明度的图像

Posted 天子骄龙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC-AlphaBlend显示具有指定透明度的图像相关的知识,希望对你有一定的参考价值。

 

    HDC hdc = ::GetDC(m_hWnd);
    BITMAP bm;
    HBITMAP hbmp = LoadBitmap(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_BITMAP1));//从资源中读取位图
    GetObject(hbmp, sizeof(BITMAP), (PSTR)&bm);//获取位图信息
    HDC hdc1 = CreateCompatibleDC(hdc);//创建内存DC
    HBITMAP oldhdc=(HBITMAP)SelectObject(hdc1, hbmp);
    BLENDFUNCTION ble = 0;//指定源和目标位图的透明混合参数
    /*
    typedef struct _BLENDFUNCTION 
    BYTE BlendOp;
    BYTE BlendFlags;
    BYTE SourceConstantAlpha;
    BYTE AlphaFormat;
 BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION;
    
    参数1:BlendOp 目前只能为AC_SRC_OVER(0x00),意思就是把源图片覆盖到目标之上
    参数2:BlendFlags 必须是0
    参数3:SourceConstantAlpha 指定源图片的透明度,这个值是会和源图片的Alpha通道值合并计算的
            如果设置为0,就会假定你的图片是透明的;
            如果需要使用每像素本身的alpha值,设置SourceConstantAlpha值255(不透明)
    参数4:AlphaFormat  控制源和目标的解析方式,AlphaFormat参数有以下值:
            AC_SRC_ALPHA(0x01):源位图必须是32位深,否则的话,AlphaBland函数将调用失败;
                    调用函数前必须预先乘以alpha值,也就是说位图上某个像素位置的red、green、blue通道值必须先与alpha相乘。
                    例如,如果alpha透明值是x,那么red、green、blue三个通道的值必须乘以x并且再除以255(因为alpha的值的范围是0~255),之后才能被调用
            0x00: AlphaBlend据说就和BitBlt一样

    */


    ble.SourceConstantAlpha = 150;
    
    AlphaBlend(hdc,10,10,bm.bmWidth,bm.bmHeight,hdc1,0,0, bm.bmWidth, bm.bmHeight,ble);//显示具有指定透明度的图像
    /*
    参数1:HDC hdcDest   指向目标设备环境的句柄
    参数2:int nXOriginDest   指定目标矩形区域左上角的X轴坐标,按逻辑单位
    参数3:int nYOriginDest   指定目标矩形区域左上角的Y轴坐标,按逻辑单位
    参数4:int nWidthDest     指定目标矩形区域的宽度,按逻辑单位
    参数5:int hHeightDest    指向目标矩形区域的高度,按逻辑单位
    参数6:HDC hdcSrc         指向源设备环境的句柄(内存DC)
    参数7:int nXOriginSrc    指定源矩形区域左上角的X轴坐标,按逻辑单位
    参数8:int nYOriginSrc    指定源矩形区域左上角的Y轴坐标,按逻辑单位
    参数9:int nWidthSrc      指定源矩形区域的宽度,按逻辑单位
    参数10:int nHeightSrc    指定源矩形区域的高度,按逻辑单位
    参数11:BLENDFUNCTION blendFunction     BLENDFUNCTION结构    
    
    */

    SelectObject(hdc1, oldhdc);
    DeleteObject(hbmp);
    DeleteObject(hdc1);

 

 

 

 

WinForms 中具有 Alpha 通道透明度/不透明度的启动画面

【中文标题】WinForms 中具有 Alpha 通道透明度/不透明度的启动画面【英文标题】:Splash-screen with alpha channels transparency/opacity in WinForms 【发布时间】:2010-10-25 12:04:32 【问题描述】:

如何在 WinForms 中使用具有 alpha 通道透明度/不透明度的图像实现闪屏?

【问题讨论】:

【参考方案1】:

取决于您的图像是哪种形状。它是你可以使用代码绘制的东西吗?如果是这样,您可以将表单绘制区域设置为形状,如下所示:

yourForm.Region = new Region(someShape);

例如,形状可以是与您的图像具有相同形状的多边形。

【讨论】:

我想使用任何具有 8 位 alpha 透明度的 PNG 图像。你还记得早期的 Adob​​e Acrobat Reader 吗?【参考方案2】:

看看Per Pixel Alpha Blend in C#

【讨论】:

以上是关于MFC-AlphaBlend显示具有指定透明度的图像的主要内容,如果未能解决你的问题,请参考以下文章

如何从具有透明背景的 matplotlib 导出绘图?

怎么让CGridCtrl复选框居中

如何显示具有多种样式的图层图

WinForms 中具有 Alpha 通道透明度/不透明度的启动画面

使用 imagecopymerge 添加时具有透明背景的图像变为白色

具有突出显示不透明度和动画的圆形 UIButton