JPEG(Joint Photograhic Experts Group)是一种高压缩比的图像格式,是目前最常用的图像格式之一。本节介绍如何在对话框中显示JPEG图像。分为以下几个步骤:
(1)调用CreateFile()函数打开JPG文件,获取文件的大小,调用GlobalAlloc()函数分配图像占用的内存空间。
(2)调用ReadFile()函数读取文件内容放置到内存中,并调用CreateStreamOnHGlobal()函数根据文件内容创建数据流。
(3)调用OleLoadPicture()函数将数据流载入PICTURE对象中,根据JPEG图像的高和宽的比例以及画布的高和宽,计算可以显示的图像范围。调用PICTURE对象的Render()函数在画布上渲染图像。具体代码如下:
- void CPlayMultiMediaDlg::OnButtonShowjpeg() // 显示JPEG图像
- {
- CDC* pDC=GetDC(); // 获取设备上下文
- LPPICTURE gpPicture = NULL;
- CString fileName = "C:\\BeautyGirl.JPG"; // 定义文件路径变量
- HANDLE hFile = CreateFile(fileName, GENERIC_READ, 0, NULL,
- OPEN_EXISTING, 0, NULL); // 创建文件句柄
- f (hFile==INVALID_HANDLE_VALUE) return;
- DWORD dwFileSize = GetFileSize(hFile, NULL); // 取得文件大小
- if (dwFileSize == -1) return;
- LPVOID pvData=NULL;
- HGLOBAL hGlobal= GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
- // 根据文件大小分配内存
- if (hGlobal != NULL) pvData=GlobalLock(hGlobal); // 锁定存储区
- if (pvData == NULL) return;
- DWORD dwBytesRead = 0;
- BOOL bRead= ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
- // 读取文件
- GlobalUnlock(hGlobal); // 释放存储区
- CloseHandle(hFile); // 关闭文件句柄
- if (!bRead) return;
- LPSTREAM pstm=NULL;
- HRESULT hr=CreateStreamOnHGlobal(hGlobal, true, &pstm); // 创建数据流
- if (!SUCCEEDED(hr)) return;
- if (gpPicture) gpPicture->Release();
- hr = OleLoadPicture(pstm, dwFileSize, false, IID_IPicture, (LPVOID*)&
- gpPicture); // 装载图片
- if (!SUCCEEDED(hr)) return;
- pstm->Release();
- HDC hdc=pDC->GetSafeHdc(); // 获取上下文
- if (gpPicture) // 如果图片有效
- {
- long hmWidth, hmHeight; // 取得图片的宽和高
- gpPicture->get_Width(&hmWidth);
- gpPicture->get_Height(&hmHeight);
- int inch = 2540; // 宽、高转换为像素
- int nWidth = MulDiv(hmWidth, GetDeviceCaps(hdc, LOGPIXELSX), inch);
- int nHeight = MulDiv(hmHeight, GetDeviceCaps(hdc, LOGPIXELSY),
- inch);
- RECT rc;
- GetClientRect(&rc); // 取得客户区
- int width = rc.right - rc.left;
- int height = rc.bottom - rc.top;
- gpPicture->Render(hdc, 0, 0, (int)height*hmWidth/hmHeight, height,
- 0, hmHeight, hmWidth, -hmHeight, &rc); // 渲染图片
- }
- }