C++ VS2013 如何在MFC中插入一张png图片

C++ VS2013 如何在MFC中插入一张png图片,第1张

你可以使用MFC的CImage类,该类的头文件是atlimage.h

下面是示例代码:

CDC *pDC = GetDC()

CImage Image

Image.Load(strPath)

if (Image.IsNull())

{

    MessageBox(_T("没加载成功"))

    return -1

}

if (Image.GetBPP() == 32) //确认该图像包含Alpha通道

{

    int i

    int j

    for (i = 0 i < Image.GetWidth() i++)

    {

        for (j = 0 j < Image.GetHeight() j++)

        {

            byte *pByte = (byte *)Image.GetPixelAddress(i, j)

            pByte[0] = pByte[0] * pByte[3] / 255

            pByte[1] = pByte[1] * pByte[3] / 255

            pByte[2] = pByte[2] * pByte[3] / 255

        }

    }

}

Image.Draw(pDC->m_hDC, 0, 0)

Image.Destroy()

ReleaseDC(pDC)

注意使用CImage,对于带alpha通道数据的图片要特别处理一下,上面的示例中,双循环体就是做的这个事情,你可以参考。

无论是GDI,GDI+或者是Cimage都是浮云,,windows上能显示的图片,一定是设备相关的位图,可以简单认为,GDI+或者是Cimage最终是将Png格式转换为位图,才显示出来的。

为了实现不规则的图形窗口,有非常多的方法,你的情况比较适合用两张位图显示,步骤如下(非唯一方案)

1. 准备一张你需要显示的位图, 比如你的照片

2. 用Photo shop一类的工具,更具第一章位图中人体的轮廓,生成一张“模板位图”

3. 在程序主窗口构造之前,获取当前屏幕的设备上下文句柄,并建立一个兼容设备上下文。

4. 在兼容上下文中选择你的照片。

5. 调用神器MaskBlt(嘎嘎,,GDI里面少有的控制底层光栅 *** 作的函数,一般只有dx才有这种武器的),使用你刚才生成的模板图,将兼容上下文拷贝到当前屏幕上下文上。

6. 阻断当前线程大概1~3秒,以完成显示。

说明: MaskBlt 中dwRop参数表明了源/目标的逻辑算符,掩码位图中0和1代表取那个算符。

0 或 仍和数都不改变这个数,,, 仍和数 “或” 1可以把自己变成1

所以,,被你涂黑的部分,,算符取“源或目标”,, 没涂黑的部分,,算符取“直接拷贝源”

核心函数:

GetDC CreateCompatibleDC MaskBlt(Cimage类中的同名方式意识是一样的) SelectObject

最后,,再次声明,,这些GDI一定是对位图在 *** 作,他们眼里没有png这个概念,如果你一定要把Png放到exe文件中,那你必须构造IStream以生成cimage对象,还不如保存两种位图,然后再用标准mfc的方法加载。。。你注意看,,为了减小应用程序的大小,连使命的召唤这样牛逼的游戏,开始的Logo都是Bmp的哦。。。

可能没有说清楚,,不过你要原谅哥哥,,哥哥高考语文只有几十分的,,,


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11288164.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存