MFC读jpg和png图片

dreamwenhao 2009-11-19 06:59:08
各位大虾好:
在MFC下面如何读取JPG和PNG的图片,BMP不用说咯。
大家是否用了第三方的库,还是自己写。但是jpg不好写的啊,不像bmp那样。
如果用的是库,有什么好的库推荐的么?opencv不要说,thank you!
...全文
1266 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuzhen9700 2012-04-16
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]
#15代码不错
[/Quote]
#15的代码可以用么,为啥我编译有问题
pady_pady 2009-11-26
  • 打赏
  • 举报
回复
ijlxx.dll
intel JPEG Library
传说这个读写jpg文件最快。
hhyocean 2009-11-26
  • 打赏
  • 举报
回复
CxImage很不错的
MoXiaoRab 2009-11-25
  • 打赏
  • 举报
回复
#15代码不错
lxfhfut 2009-11-25
  • 打赏
  • 举报
回复
呜呜 我只会C/C++
paerxiushi 2009-11-23
  • 打赏
  • 举报
回复
可以使用Ole函数:
1.先添加头文件
#include "olectl.h"
#include "ole2.h"
2.在对话框类中加入成员变量:
IPicture* pPicture;
IStream* pStream;
HGLOBAL hMem;
3.读取JPG图片

BOOL CInsertIconDlg::LoadAnImage(TCHAR* FileName)
{
// Use IPicture stuff to use JPG / GIF files
CFile file;
if( !file.Open( FileName, CFile::modeRead) )
return FALSE;

DWORD m_nFileLen;
m_nFileLen = file.GetLength();

hMem = ::GlobalAlloc( GMEM_MOVEABLE, m_nFileLen );
LPVOID lpBuf = ::GlobalLock( hMem );
if( file.Read( lpBuf, m_nFileLen ) != m_nFileLen )
return FALSE;
file.Close();

::GlobalUnlock( hMem );

if ( CreateStreamOnHGlobal( hMem, TRUE, &pStream ) !=S_OK )
return FALSE;

if ( OleLoadPicture( pStream, m_nFileLen, TRUE, IID_IPicture, ( LPVOID * )&pPicture ) !=S_OK )
return FALSE;

return TRUE;
}

4.在对话框的OnPaint函数中显示图片

void CInsertIconDlg::OnPaint()
{
CPaintDC dc(this);
int x=0,y=0;
if (pPicture != NULL)
{
long nWidth,nHeight;
pPicture->get_Width( &nWidth );
pPicture->get_Height( &nHeight );
CRect rect;
GetClientRect(&rect);
pPicture->Render(dc,x,y,rect.Width(),rect.Height(),0,nHeight,nWidth,-nHeight,NULL);
}
CDialog::OnPaint();

}

5.添加析构函数清除资源:
CInsertIconDlg::~CInsertIconDlg()
{
pPicture->Release();
pStream->Release();
GlobalFree(hMem);

}
心静以致远 2009-11-21
  • 打赏
  • 举报
回复
同上 或者是GDI+的CImage类
loop_k 2009-11-21
  • 打赏
  • 举报
回复
恩 图像处理CxImage是个不错的库
dreamwenhao 2009-11-20
  • 打赏
  • 举报
回复
是编程处理的撒!~
lover9 2009-11-20
  • 打赏
  • 举报
回复
http://blog.csdn.net/king_lu/archive/2007/09/26/1802215.aspx
上面是使用方法地址。
lover9 2009-11-20
  • 打赏
  • 举报
回复
LZ,这个我刚搞过,推荐用CxImage库,很方便的。
lambochan 2009-11-20
  • 打赏
  • 举报
回复
直接把CxImage的png/jpeg库分割出来就ok了..
根本不需要用那体积庞大的东西(假如只是处理jpg/png).
fandh 2009-11-20
  • 打赏
  • 举报
回复
建议用CXIMAGE,直接使用!
http://www.codeproject.com/KB/graphics/cximage.aspx
这个是开源的,还有例子!
peterormike 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dreamwenhao 的回复:]
要对图像进行处理的。
[/Quote]

那就更应该用GDI+了
ToperRay 2009-11-20
  • 打赏
  • 举报
回复
一般用第三方的库,用CxImage
nintendo_dskay 2009-11-20
  • 打赏
  • 举报
回复
楼主如果想加载PNG图片的话可以用下面这个函数,本人最近一直在用
PNG需要预先导入MFC的资源里面
JPG应该也是可以的

//三个参数分别为PNG的资源值,资源类型,GDI+的Image类指针引用
BOOL ImageFromIDResource(UINT resourceID, LPCTSTR resourceType,Image*& image)
{
HINSTANCE hInst = AfxGetResourceHandle();
HRSRC hRsrc = ::FindResource(hInst,MAKEINTRESOURCE(resourceID),resourceType);
if (hRsrc == NULL)
return FALSE;

// load resource into memory
DWORD len = SizeofResource(hInst, hRsrc);
BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);
if (lpRsrc == NULL)
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
image = Gdiplus::Image::FromStream(pstm);

// free/release stuff
//GlobalUnlock(m_hMem);
GlobalFree(m_hMem);
pstm->Release();
FreeResource(lpRsrc);

return TRUE;
}
huangkaigoodup 2009-11-19
  • 打赏
  • 举报
回复
用ps的话,就打开在存储时变换格式就可以啦
dreamwenhao 2009-11-19
  • 打赏
  • 举报
回复
要对图像进行处理的。
huangkaigoodup 2009-11-19
  • 打赏
  • 举报
回复
碰到这种情况,将jpg等其它格式转换为bmp的就行了
既简单又方便 呵呵...
StarsunYzL 2009-11-19
  • 打赏
  • 举报
回复
只是为了显示或者做界面的话,用GDI+不行么?

19,472

社区成员

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

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