MFC显示JPG图片

54 篇文章 0 订阅
51 篇文章 3 订阅

参考文章:http://blog.csdn.net/crearo/article/details/1328974

-----------------------------------------------------------------------------------------------

效果截图:


-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

主要代码如下:

//************************************
// 方法说明:    显示JPG和GIF、BMP图片
// 参数说明:    CDC * pDC           设备环境对象
// 参数说明:    CString strPath     要显示的图片路径 
// 参数说明:    int x               要显示的X位置
// 参数说明:    int y               要显示的Y位置
// 返回值:      BOOL                成功返回TRUE,否则返回FALSE
//************************************
BOOL CShowJpgDlg::ShowJpgGif(CDC* pDC,CString strPath, int x, int y)

{
    CFileStatus fstatus;  
    CFile file;  
    ULONGLONG cb;  

    // 打开文件并检测文件的有效性
     if (!file.Open(strPath,CFile::modeRead))
     {
         return FALSE;
     }
     if (!file.GetStatus(strPath,fstatus))
     {
         return FALSE;
     }
     if ((cb =fstatus.m_size)<=0)
     {
         return FALSE;
     }

     // 根据文件大小分配内存空间,记得释放内存
     HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, (unsigned int)cb);  
      if (hGlobal== NULL) 
      {
          return FALSE;
      }

      // 锁定刚才分配的内存空间
      LPVOID pvData = NULL;  
      pvData = GlobalLock(hGlobal);
      if (pvData == NULL)  
      {  
            GlobalFree(hGlobal);  // 记得释放内存
            return FALSE;
      } 

      // 将文件放到流中
      IStream *pStm;  
      file.Read(pvData,(unsigned int)cb);  
      GlobalUnlock(hGlobal);  
      CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);  
 
    // 从流中加载图片
    // 显示JPEG和GIF格式的图片,GIF只能显示一帧,还不能显示动画,
    // 要显示动画GIF请使用ACTIVE控件。
    IPicture *pPic; 
    if(OleLoadPicture(pStm,(LONG)fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic)!=S_OK) 
    { 
        GlobalFree(hGlobal);  // 记得释放内存
        return FALSE;
    }

    //获取图像宽和高,注意这里的宽和高不是图像的分辨率
    OLE_XSIZE_HIMETRIC hmWidth;  
    OLE_YSIZE_HIMETRIC hmHeight;  
    pPic->get_Width(&hmWidth);  
    pPic->get_Height(&hmHeight);  

    // 将图像宽度和高度单位转化为像素单位
   //#define HIMETRIC_PER_INCH 2540
   //int nPicWidth =  MulDiv(hmWidth, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSX),2540);
   //int nPicHeight = MulDiv(hmHeight, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSY),2540);

   
    //HRESULT Render(
    //    HDC hdc, //Handle of device context on which to render the image
    //    long x,  //Horizontal position of image in hdc
    //    long y,  //Vertical position of image in hdc
    //    long cx, //Horizontal dimension of destination rectangle
    //    long cy, //Vertical dimension of destination rectangle
    //    OLE_XPOS_HIMETRIC xSrc,      //Horizontal offset in source picture
    //    OLE_YPOS_HIMETRIC ySrc,      //Vertical offset in source picture
    //    OLE_XSIZE_HIMETRIC cxSrc,    //Amount to copy horizontally in source picture
    //    OLE_YSIZE_HIMETRIC cySrc,    //Amount to copy vertically in source picture
    //    LPCRECT prcWBounds           //Pointer to position of destination for a metafile hdc
    //    );

    //use render function display image
    RECT rtWnd;
    pDC->GetWindow()->GetWindowRect(&rtWnd);
    int iWndWidth=rtWnd.right-rtWnd.left;
    int iWndHeight=rtWnd.bottom-rtWnd.top;
    
    if(FAILED(pPic->Render(*pDC,x,y,iWndWidth,iWndHeight,0,hmHeight,hmWidth,-hmHeight,NULL)))  
    {
        pPic->Release();
        GlobalFree(hGlobal);  // 记得释放内存
        return false;
    }

    pPic->Release(); 
    GlobalFree(hGlobal);  // 记得释放内存
    return true;
}

//************************************
// 方法说明:    显示JPG和GIF、BMP图片
// 参数说明:    CDC * pDC           设备环境对象
// 参数说明:    CString strPath     要显示的图片路径 
// 参数说明:    int x               要显示的X位置
// 参数说明:    int y               要显示的Y位置
// 返回值:      BOOL                成功返回TRUE,否则返回FALSE
//************************************
BOOL CShowJpgDlg::ShowImage(CDC* pDC,CString strPath, int x, int y)
{
   
    IPicture *pPic=NULL; 
    OleLoadPicturePath(CComBSTR(strPath.GetBuffer()), (LPUNKNOWN)NULL, 0, 0, IID_IPicture,(LPVOID*)&pPic);
    if (NULL==pPic)
    {
        return FALSE;
    }

    // 获取图像宽和高,注意这里的宽和高不是图像的分辨率
    OLE_XSIZE_HIMETRIC hmWidth;  
    OLE_YSIZE_HIMETRIC hmHeight;  
    pPic->get_Width(&hmWidth);  
    pPic->get_Height(&hmHeight);  

    // 将图像宽度和高度单位转化为像素单位
   //#define HIMETRIC_PER_INCH 2540
   //int nPicWidth =  MulDiv(hmWidth, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSX),2540);
   //int nPicHeight = MulDiv(hmHeight, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSY),2540);

   // 获取显示图片窗口的宽度和高度
   RECT rtWnd;
   pDC->GetWindow()->GetWindowRect(&rtWnd);
   int iWndWidth=rtWnd.right-rtWnd.left;
   int iWndHeight=rtWnd.bottom-rtWnd.top;

   if(FAILED(pPic->Render(*pDC,x,y,iWndWidth,iWndHeight,0,hmHeight,hmWidth,-hmHeight,NULL)))  
   {
       pPic->Release();
       return false;
   }

   //记得释放资源,不然会导致内存泄露
   pPic->Release(); 
   
   return true;
}


//************************************
// 方法说明:    浏览图片
// 返回值:      void
//************************************
void CShowJpgDlg::OnBnClickedBtnBrowse()
{
    // TODO: Add your control notification handler code here
    CFileDialog dlg(TRUE,"jpg","*.jpg", OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, 
        "JPEG文件(*.jpg)|*.jpg|GIF文件(*.gif)|*.gif|bmp文件(*.bmp)|*.bmp|",NULL); 
    if(dlg.DoModal()==IDOK) 
    { 
        SetDlgItemText(IDC_TXT_PATH,dlg.GetPathName());

        //设置静态控件的样式,使其可以使用位图,并使位图显示居中
        ((CStatic*)GetDlgItem(IDC_STATIC_IMG))-> ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);

		CDC *pDC=NULL;
		pDC=GetDlgItem(IDC_STATIC_IMG)->GetDC();
        //ShowJpgGif(pDC,dlg.GetPathName(),0,0);
        ShowImage(pDC,dlg.GetPathName(),0,0);

		ReleaseDC(pDC);	// 记得释放资源,不然会导致内存泄露
    } 

}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

例子工程(VS2010)下载地址:http://download.csdn.net/detail/friendan/7709595

-----------------------------------------------------------------------------------------------------

您的十分满意是我追求的宗旨。

您的一点建议是我后续的动力。








  • 8
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
### 回答1: 在 MFC显示 jpg 图片可以通过以下步骤实现: 首先,需要在 MFC 应用程序中添加一个 Picture Control 控件,用于显示图片。 接下来,需要导入相关的头文件,包括 "afx.h" 和 "afxwin.h"。 然后,在应用程序的消息映射中,添加一个响应 Picture Control 控件更新消息的处理函数。 在该处理函数中,可以使用 MFC 提供的 CImage 类来加载和显示 jpg 图片。可以使用 CImage 的 Load() 函数加载指定路径的 jpg 图片。例如,可以使用类似下面的代码加载图片: CImage image; image.Load(_T("路径/图片名.jpg")); 然后,可以使用 Picture Control 控件的 SetBitmap() 函数将加载的图片设置为要显示的位图。例如,可以使用下面的代码将图片设置为 Picture Control 控件的位图: m_pictureControl.SetBitmap(image.Detach()); 最后,应该确保在程序退出时,释放图片资源,可以在析构函数或销毁 Picture Control 控件的处理函数中调用 CImage 的 Destroy() 函数释放图片资源: image.Destroy(); 通过以上步骤,就可以在 MFC 应用程序中成功显示 jpg 图片了。 ### 回答2: 在MFC显示JPG图片需要使用GDI+库。 首先,需要添加GDI+的头文件和库文件: ``` #include <gdiplus.h> #pragma comment(lib,"gdiplus.lib") using namespace Gdiplus; ``` 然后,在MFC的窗口类中重写OnPaint函数用于绘制图片: ``` void CYourWndClass::OnPaint() { CPaintDC dc(this); GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); Graphics graphics(dc.GetSafeHdc()); Image image(L"your_image.jpg"); // 替换为图片路径和名称 graphics.DrawImage(&image, 0, 0, image.GetWidth(), image.GetHeight()); GdiplusShutdown(gdiplusToken); } ``` 上述代码中,使用`Image`类加载JPG图片,并使用`Graphics`类的`DrawImage`函数将图片绘制到窗口上。 最后,在窗口的初始化函数(如OnInitDialog)中调用Invalidate函数来触发窗口的重绘: ``` BOOL CYourWndClass::OnInitDialog() { CDialog::OnInitDialog(); Invalidate(); return TRUE; } ``` 以上就是使用MFC显示JPG图片的基本步骤。如果想要在其他控件中显示图片,可以在对应的控件绘制函数中使用相同的方法来绘制图片。 ### 回答3: 在MFC中,我们可以使用CImage类来显示jpg图片。 首先,需要在程序中引入相关的头文件和库,包括atlimage.h和comdef.h。 然后,我们可以创建一个CImage对象,并调用其Load函数加载jpg图片文件。例如,假设我们有一个名为image.jpgjpg图片文件,可以使用以下代码加载该图片: CImage image; image.Load(_T("image.jpg")); 接下来,我们需要将CImage对象中的图片绘制到显示窗口上。可以使用CDC类的相关函数来实现绘制操作。 首先,需要获取显示窗口的CDC对象。一种常见的方法是在窗口类中重写OnPaint函数,然后在该函数中获取CDC对象。例如: void CMyWindow::OnPaint() { CPaintDC dc(this); // 获取窗口的DC对象 // 在这里进行绘制操作 } 然后,在获取到CDC对象后,可以使用CDC的相关函数来绘制CImage对象中的图片。例如,可以使用CDC的BitBlt函数来实现简单的绘制操作。以下是一个示例代码: void CMyWindow::OnPaint() { CPaintDC dc(this); // 获取窗口的DC对象 // 绘制CImage对象中的图片 int width = image.GetWidth(); int height = image.GetHeight(); image.BitBlt(dc.GetSafeHdc(), 0, 0, width, height, 0, 0, SRCCOPY); } 在上述示例代码中,我们首先获取了CImage对象的宽度和高度,并使用CDC的BitBlt函数将CImage对象中的图片绘制到窗口的DC对象上。 以上是一种简单的在MFC显示jpg图片的方法。当然,还有其他多种方式可以实现此功能,具体的方法可以根据实际需求进行选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

friendan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值