显示JPEG图像

来源:互联网 发布:信息发布网站源码 编辑:程序博客网 时间:2024/05/18 10:20


JPEG(Joint Photograhic Experts Group)是一种高压缩比的图像格式,是目前最常用的图像格式之一。本节介绍如何在对话框中显示JPEG图像。分为以下几个步骤:

(1)调用CreateFile()函数打开JPG文件,获取文件的大小,调用GlobalAlloc()函数分配图像占用的内存空间。

(2)调用ReadFile()函数读取文件内容放置到内存中,并调用CreateStreamOnHGlobal()函数根据文件内容创建数据流。

(3)调用OleLoadPicture()函数将数据流载入PICTURE对象中,根据JPEG图像的高和宽的比例以及画布的高和宽,计算可以显示的图像范围。调用PICTURE对象的Render()函数在画布上渲染图像。具体代码如下:

  1. void CPlayMultiMediaDlg::OnButtonShowjpeg()             // 显示JPEG图像  
  2. {  
  3.     CDC*   pDC=GetDC();                                 // 获取设备上下文  
  4.         LPPICTURE   gpPicture = NULL;  
  5.     CString fileName = "C:\\BeautyGirl.JPG";            // 定义文件路径变量  
  6.         HANDLE hFile = CreateFile(fileName, GENERIC_READ,  0,  NULL,  
  7.             OPEN_EXISTING, 0, NULL);                    // 创建文件句柄  
  8.     f (hFile==INVALID_HANDLE_VALUE) return;  
  9.     DWORD   dwFileSize = GetFileSize(hFile, NULL);      // 取得文件大小  
  10.     if (dwFileSize == -1) return;  
  11.     LPVOID pvData=NULL;  
  12.     HGLOBAL hGlobalGlobalAlloc(GMEM_MOVEABLE, dwFileSize);  
  13.                                                     // 根据文件大小分配内存  
  14.     if (hGlobal != NULL) pvData=GlobalLock(hGlobal);    // 锁定存储区  
  15.     if (pvData  == NULL) return;  
  16.     DWORD dwBytesRead = 0;  
  17.     BOOL bReadReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);  
  18.                                                         // 读取文件  
  19.     GlobalUnlock(hGlobal);                              // 释放存储区  
  20.     CloseHandle(hFile);                                 // 关闭文件句柄  
  21.     if (!bRead)  return;  
  22.     LPSTREAM pstm=NULL;  
  23.     HRESULT hr=CreateStreamOnHGlobal(hGlobal, true, &pstm); // 创建数据流  
  24.     if (!SUCCEEDED(hr)) return;  
  25.     if (gpPicture)      gpPicture->Release();  
  26.     hr = OleLoadPicture(pstm, dwFileSize, false, IID_IPicture, (LPVOID*)&  
  27.     gpPicture); // 装载图片  
  28.     if (!SUCCEEDED(hr)) return;  
  29.     pstm->Release();  
  30.     HDC hdc=pDC->GetSafeHdc();                          // 获取上下文  
  31.     if (gpPicture)                                      // 如果图片有效  
  32.     {  
  33.         long   hmWidth, hmHeight;                       // 取得图片的宽和高  
  34.         gpPicture->get_Width(&hmWidth);  
  35.         gpPicture->get_Height(&hmHeight);  
  36.         int inch = 2540;                                // 宽、高转换为像素  
  37.         int nWidth = MulDiv(hmWidth, GetDeviceCaps(hdc, LOGPIXELSX), inch);  
  38.         int  nHeight = MulDiv(hmHeight, GetDeviceCaps(hdc, LOGPIXELSY),  
  39.         inch);  
  40.         RECT rc;  
  41.         GetClientRect(&rc);                             // 取得客户区  
  42.         int width = rc.right - rc.left;  
  43.         int height = rc.bottom - rc.top;  
  44.         gpPicture->Render(hdc, 0, 0, (int)height*hmWidth/hmHeight, height,  
  45.                     0, hmHeight, hmWidth, -hmHeight, &rc);  // 渲染图片  
  46.     }  
0 0
原创粉丝点击