C/C++:如何在程序中加载JPG图片?

2016-02-19 20:53 4 1 收藏

每个人都希望每天都是开心的,不要因为一些琐事扰乱了心情还,闲暇的时间怎么打发,关注图老师可以让你学习更多的好东西,下面为大家推荐C/C++:如何在程序中加载JPG图片?,赶紧看过来吧!

【 tulaoshi.com - 编程语言 】

MFC提供的CWnd只有默认加载BMP文件的接口,对JPG等图像是不支持的,而实际中经常需要用到非BMP的图片,加载它们需要使用COM技术。首先写如下函数:以下是引用片段:
  BOOL LoadMyJpegFile(CString fname,LPPICTURE *lppi)
  {
   HANDLE hFile=CreateFile(fname,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); if(hFile==INVALID_HANDLE_VALUE)
   {
    CString str;
    str.Format(_T("%s无法被打开"),fname);
    MessageBox(str);
    return FALSE;
   }
   //取得文件大小
   DWORD dwFileSize=GetFileSize(hFile,NULL); if((DWORD)-1==dwFileSize)
   {
    CloseHandle(hFile);
    MessageBox(_T("图像文件是空的"));
    return FALSE;
   }
   //读取图像文件
   LPVOID pvData; //按文件大小分配内存
   HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,dwFileSize); if(NULL==hGlobal)
   {
    CloseHandle(hFile);
    MessageBox(_T("内存不足,无法分配足够内存"));
    return FALSE;
   } pvData=GlobalLock(hGlobal);
   if(NULL==pvData)
   {
    GlobalUnlock(hGlobal);
    CloseHandle(hFile);
    MessageBox(_T("无法锁定内存"));
    return FALSE;
   } DWORD dwFileRead=0;
   BOOL bRead=ReadFile(hFile,pvData,dwFileSize,&dwFileRead,NULL);
   GlobalUnlock(hGlobal);
   CloseHandle(hFile);
   if(FALSE==bRead)
   {
    MessageBox(_T("读文件出错"));
    return FALSE;
   } LPSTREAM pstm=NULL;
   //从已分配内存生成IStream流
   HRESULT hr=CreateStreamOnHGlobal(hGlobal,TRUE,&pstm); if(!SUCCEEDED(hr))
   {
    MessageBox(_T("生成流操作失败"));
    if(pstm!=NULL)
     pstm-Release();
    return FALSE;
   }
   else if(pstm==NULL)
   {
    MessageBox(_T("生成流操作失败"));
    return FALSE;
   } if(!*lppi)
    (*lppi)-Release();
   hr=OleLoadPicture(pstm,dwFileSize,FALSE,IID_IPicture,(LPVOID*)&(*lppi));
   pstm-Release();
   if(!SUCCEEDED(hr))
   {
    MessageBox(_T("加载操作失败"));
    return FALSE;
   }
   else if(*lppi==NULL)
   {
    MessageBox(_T("加载操作失败"));
    return FALSE;
   }
   return TRUE;
  }  然后在头文件中加入变量声明和函数声明:以下是引用片段:
  BOOL LoadMyJpegFile(CString fname,LPPICTURE *lppi);
   LPPICTURE m_lppi;//加载图像文件的流
   BOOL m_bHadLoad;//已经加载了背景图像
  然后在OnPaint函数中加入:  if(m_bHadLoad)
    {
     CDC *pDC=GetDC();
     CRect rc;
     long hmWidth=0;
     long hmHeight=0;
     m_lppi-get_Height(&hmHeight);
     m_lppi-get_Width(&hmWidth);
     GetClientRect(&rc);
     int nWidth,nHeight;
     nWidth=rc.Width();
     nHeight=rc.Height();
     HRESULT hr=m_lppi-Render(pDC-m_hDC,nWidth,0,-nWidth,nHeight,hmWidth,hmHeight,-hmWidth,-hmHeight,&rc);
    }
  在OnInitDialog函数中这样调用上面的加载函数: TCHAR strPath[MAX_PATH];
   memset(strPath,0,MAX_PATH);
   GetCurrentDirectory(MAX_PATH,strPath);
   wcscat_s(strPath,MAX_PATH,_T("a_bear.jpg"));
   m_bHadLoad=LoadMyJpegFile(strPath,&m_lppi);
  就可以显示jpg图片了,最后要记得在OnDestroy函数中加入: m_lppi-Release();
  来释放对象。

来源:http://www.tulaoshi.com/n/20160219/1624780.html

延伸阅读
C++
/*p129*/#include class CComplex{public: CCpomplex(double r=0,double i=0) { realPart=r; imagePart=i; } void print() { cout /*p129*/#include class CComplex{public: CCpomplex(double r=0,double i=0) { realPart=r; imagePart=i; } void print() { cout
C++中,成员指针是最为复杂的语法结构。但在事件驱动和多线程应用中被广泛用于调用回叫函数。在多线程应用中,每个线程都通过指向成员函数的指针来调用该函数。在这样的应用中,如果不用成员指针,编程是非常困难的。 刚遇到这种语法时也许会让你止步不前。但你会发现,使用恰当的类型定义之后,复杂的语法是可以简化的。本文引导你了解成...
    C++ Builder提供了所有开始设计应用程序所必需的工具: · 一个称为“窗体”的空白窗口,作为用于设计应用程序的用户界面。 · 一个包容许多可重用的对象的扩展的类库。 · 一个对象观察器,用于检查和改变对象的特性。 · 用于直接访问基本程序逻辑的源代码编辑器。 ·一个可以治理多个工程...
本试题仅用于考查C++/C程序员的基本编程技能。内容限于C++/C常用语法,不涉及数据结构、算法以及深奥的语法。考试成绩能反映出考生的编程质量以及对C++/C的理解程度,但不能反映考生的智力和软件开发能力。 笔试时间90分钟。请考生认真答题,切勿轻视。 一、请填写BOOL , float, 指针变量 与零值比较的 if 语句。(10分) ...
处理 C++ 中的异常会在语言级别上碰到少许隐含限制,但在某些情况下,您可以绕过它们。学习各种利用异常的方法,您就可以生产更可靠的应用程序。 保留异常

经验教程

38

收藏

76
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部