winapi 关于加载png图片的问题

qulcc 2010-05-02 10:27:09
我想问下用winapi
怎么加载PNG图片
winapi好像是不行的
要用什么第三方库吗 我的程序是用api写的 想美化一下
大家说详细点 谢谢了!!!
...全文
492 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qulcc 2010-05-12
  • 打赏
  • 举报
回复
这个问题我是这样解决的
用GDI+
结贴 给分
///////code///////
#include<windows.h>
#include<GDIplus.h> //
#include<stdio.h>
#pragma comment(lib, "gdiplus.lib")//
using namespace Gdiplus;//
。。。
Graphics graphics(item->hDC);
Image image(L"anniu.png",false);
graphics.DrawImage(&image,itemRect.left,itemRect.top,24,24);
。。。
辰岡墨竹 2010-05-11
  • 打赏
  • 举报
回复
直接用libPng吧,很多看图程序都是用这个的,而且能跨平台。
ringphone 2010-05-11
  • 打赏
  • 举报
回复
API的话有免费的PNG库,搜一下吧
向立天 2010-05-11
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
wltg2001 2010-05-03
  • 打赏
  • 举报
回复
png图像如果用API加载的话,用IPicture应该可以吧:
::CoInitialize(NULL); // COM 初始化
HRESULT hr;
CFile file;

file.Open( "c:\\aa.jpg", CFile::modeRead | CFile::shareDenyNone ); // 读入文件内容
DWORD dwSize = file.GetLength();
HGLOBAL hMem = ::GlobalAlloc( GMEM_MOVEABLE, dwSize );
LPVOID lpBuf = ::GlobalLock( hMem );
file.ReadHuge( lpBuf, dwSize );
file.Close();
::GlobalUnlock( hMem );
IStream * pStream = NULL;
IPicture * pPicture = NULL;
// 由 HGLOBAL 得到 IStream,参数 TRUE 表示释放 IStream 的同时,释放内存
hr = ::CreateStreamOnHGlobal( hMem, TRUE, &pStream );
ASSERT ( SUCCEEDED(hr) );
hr = ::OleLoadPicture( pStream, dwSize, TRUE, IID_IPicture, ( LPVOID * )&pPicture );
ASSERT(hr==S_OK);

long nWidth,nHeight; // 宽高,MM_HIMETRIC 模式,单位是0.01毫米
pPicture->get_Width( &nWidth ); // 宽
pPicture->get_Height( &nHeight ); // 高

////////原大显示//////
CSize sz( nWidth, nHeight );
pDC->HIMETRICtoDP( &sz ); // 转换 MM_HIMETRIC 模式单位为 MM_TEXT 像素单位
pPicture->Render(pDC->m_hDC,0,0,sz.cx,sz.cy,
0,nHeight,nWidth,-nHeight,NULL);

////////按窗口尺寸显示////////
// CRect rect; GetClientRect(&rect);
// pPicture->Render(pDC->m_hDC,0,0,rect.Width(),rect.Height(),
// 0,nHeight,nWidth,-nHeight,NULL);
if ( pPicture ) pPicture->Release();// 释放 IPicture 指针
if ( pStream ) pStream->Release(); // 释放 IStream 指针,同时释放了 hMem

::CoUninitialize();
}

尹成 2010-05-03
  • 打赏
  • 举报
回复
使用GDI+,用以下函数来加载PNG图片:
/***********************************************************************
函数名 :ImageFromIDResource
描述 :从资源中读取png图像
输入参数:
UINT nID ,资源的ID值
LPCTSTR sTR ,资源所属的位置
输出参数:
Image* &pImg,返回的图像指针引用
返回值:提取资源图像成功则为TRUE,否则为FALSE
***********************************************************************/
BOOL ImageFromIDResource(UINT nID, LPCTSTR sTR,Image * &pImg)
{
HINSTANCE hInst = AfxGetResourceHandle();
HRSRC hRsrc = ::FindResource (hInst,MAKEINTRESOURCE(nID),sTR); // type
if (!hRsrc)
return FALSE;
// load resource into memory
DWORD len = SizeofResource(hInst, hRsrc);
BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);
if (!lpRsrc)
return FALSE;
// Allocate global memory on which to create stream
HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);
BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
memcpy(pmem,lpRsrc,len);
IStream* pstm;
CreateStreamOnHGlobal(m_hMem,FALSE,&pstm);
// load from stream
pImg=Gdiplus::Image::FromStream(pstm);
// free/release stuff
GlobalUnlock(m_hMem);
pstm->Release();
FreeResource(lpRsrc);
return TRUE;
}
qulcc 2010-05-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dream238 的回复:]

可以尝试用GDI+
[/Quote]
问下怎么使用GDI+
要加载什么头文件吗?
我是个新手
ArcRain 2010-05-02
  • 打赏
  • 举报
回复
可以尝试用GDI+

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧