怎么在程序中显示出png图片 我用vc08,mfc框架的程序vcMFC图片插入 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CImage::Load/Draw()加载显示PNG图片 bool CEditListBox::LoadImageFromResource(IN CImage* pImage,IN UINT nResID,IN LPCWSTR lpTyp){ if ( pImage == NULL) return false; pImage->Destroy(); if(lpTyp == RT_BITMAP) { pImage->LoadFromResource(AfxGetResourceHandle(),MAKEINTRESOURCE(nResID)); } else // PNG { HRSRC hRsrc = ::FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(nResID), lpTyp); if (hRsrc == NULL) return false; HGLOBAL hImgData = ::LoadResource(AfxGetResourceHandle(), hRsrc); if (hImgData == NULL) { ::FreeResource(hImgData); return false; } LPVOID lpVoid = ::LockResource(hImgData); LPSTREAM pStream = NULL; DWORD dwSize = ::SizeofResource(AfxGetResourceHandle(), hRsrc); HGLOBAL hNew = ::GlobalAlloc(GHND, dwSize); LPBYTE lpByte = (LPBYTE)::GlobalLock(hNew); ::memcpy(lpByte, lpVoid, dwSize); ::GlobalUnlock(hNew); HRESULT ht = ::CreateStreamOnHGlobal(hNew, TRUE, &pStream); if ( ht != S_OK ) { GlobalFree(hNew); } else { pImage->Load(pStream); GlobalFree(hNew); } ::FreeResource(hImgData); } return true;}void CEditListBox::HandleAlpha( CImage *img ){ if (img->GetBPP() == 32) { int i; int j; for (i = 0; i < img->GetWidth(); i++) { for (j = 0; j < img->GetHeight(); j++) { byte *pByte = (byte *)img->GetPixelAddress(i, j); pByte[0] = pByte[0] * pByte[3] / 255; pByte[1] = pByte[1] * pByte[3] / 255; pByte[2] = pByte[2] * pByte[3] / 255; } } }}使用方法:CImage img; LoadImageFromResource(&img,id,_T("PNG")); // id为资源IDHandleAlpha(&img);然后就可以用img.Draw(........)了 开源图像库,OpenCV、CxImage都很方便 自定义消息问题,郁闷,帮帮忙 急救!!程序由MFC共享dll改为MFC静态dll出现莫名其妙的错误! 窗口布局问题 关于回车键换行的问题? 急,简单:dlg.DoModal(),对话框弹出问题? CDaoRecordset在Acess数据库查询问题? WIN2000重启用什么函数呀? 一个关于dll的很菜的问题 如何在win2k中共享而不出现共享标志, 如何让工具条禁用 问一下动态tls有什么用? 多线程拷贝大文件
{
if ( pImage == NULL) return false;
pImage->Destroy();
if(lpTyp == RT_BITMAP)
{
pImage->LoadFromResource(AfxGetResourceHandle(),MAKEINTRESOURCE(nResID));
}
else // PNG
{
HRSRC hRsrc = ::FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(nResID), lpTyp);
if (hRsrc == NULL) return false; HGLOBAL hImgData = ::LoadResource(AfxGetResourceHandle(), hRsrc);
if (hImgData == NULL)
{
::FreeResource(hImgData);
return false;
} LPVOID lpVoid = ::LockResource(hImgData);
LPSTREAM pStream = NULL;
DWORD dwSize = ::SizeofResource(AfxGetResourceHandle(), hRsrc);
HGLOBAL hNew = ::GlobalAlloc(GHND, dwSize);
LPBYTE lpByte = (LPBYTE)::GlobalLock(hNew);
::memcpy(lpByte, lpVoid, dwSize); ::GlobalUnlock(hNew); HRESULT ht = ::CreateStreamOnHGlobal(hNew, TRUE, &pStream);
if ( ht != S_OK )
{
GlobalFree(hNew);
}
else
{
pImage->Load(pStream);
GlobalFree(hNew);
}
::FreeResource(hImgData);
} return true;
}void CEditListBox::HandleAlpha( CImage *img )
{
if (img->GetBPP() == 32)
{
int i;
int j;
for (i = 0; i < img->GetWidth(); i++)
{
for (j = 0; j < img->GetHeight(); j++)
{
byte *pByte = (byte *)img->GetPixelAddress(i, j);
pByte[0] = pByte[0] * pByte[3] / 255;
pByte[1] = pByte[1] * pByte[3] / 255;
pByte[2] = pByte[2] * pByte[3] / 255;
}
}
}
}使用方法:
CImage img;
LoadImageFromResource(&img,id,_T("PNG")); // id为资源ID
HandleAlpha(&img);然后就可以用img.Draw(........)了