你可以使用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的哦。。。
可能没有说清楚,,不过你要原谅哥哥,,哥哥高考语文只有几十分的,,,
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)