我在网上查了很多资料,都说是通过IPicture接口来实现显示jpg字节流图像(是从考勤机上不停的发过byte* buffer)。具体函数如下:void DisplayPic(byte* imageBuffer, CDC* pDc, int nSrcWidth, int nSrcHeight, int size)
{
IStream * pStream = NULL;
IPicture * pPicture = NULL;
HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLE, size);
LPVOID lpBuf = ::GlobalLock(hMem);
memcpy(lpBuf, (void*)imageBuffer, size);
::GlobalUnlock(hMem); HRESULT hr = ::CreateStreamOnHGlobal(hMem, TRUE, &pStream);
ASSERT (SUCCEEDED(hr));
hr = ::OleLoadPicture(pStream, size, FALSE, IID_IPicture, (LPVOID *)&pPicture ); //得到pPicture接口失败
ASSERT(hr==S_OK);
pPicture->Render(pDc->m_hDC, 0, 0, nSrcWidth, nSrcHeight, 0, nSrcHeight, nSrcWidth, -nSrcHeight, NULL);
pPicture->Release();
GlobalFree(hMem);
}
我在MSDN上查了OleLoadPicture上面Res写了
The stream must be in BMP (bitmap), WMF (metafile), or ICO (icon) format. A picture object created using OleLoadPicture always has ownership of its internal resources (fOwn==TRUE is implied).是不是这个函数只能得到bmp、WMF、ICO格式。
但我通过同样的方法为什么能显示jpg文件呢?方法如下:
HRESULT DisplayPic(CString lpImageFile, HWND hWnd, int nScrWidth, int nScrHeight)
{
HDC hDC_Temp=::GetDC(hWnd); IPicture *pPic;
IStream *pStm; BOOL bResult; HANDLE hFile=NULL;
DWORD dwFileSize,dwByteRead; //打开硬盘中的图形文件
hFile=CreateFile(lpImageFile,GENERIC_READ,
FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile!=INVALID_HANDLE_VALUE)
{
dwFileSize=GetFileSize(hFile,NULL);//获取文件字节数 if (dwFileSize==0xFFFFFFFF)
return E_FAIL;
}
else
{
return E_FAIL;
} //分配全局存储空间
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
LPVOID pvData = NULL; if (hGlobal == NULL)
{
AfxMessageBox(_T("图形文件分配出错."));
return E_FAIL;
} if ((pvData = GlobalLock(hGlobal)) == NULL)//锁定分配内存块
{
AfxMessageBox(_T("内存块锁定出问题"));
return E_FAIL;
} ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把文件读入内存缓冲区 GlobalUnlock(hGlobal); if(CreateStreamOnHGlobal(hGlobal, TRUE, &pStm) != S_OK)
{
AfxMessageBox(_T("流初始化失败"));
return E_FAIL;
} //装入图形文件
bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic); if(FAILED(bResult))
{
AfxMessageBox(_T("图形文件装载出错."));
return E_FAIL;
} OLE_XSIZE_HIMETRIC hmWidth;//图片的真实宽度
OLE_YSIZE_HIMETRIC hmHeight;//图片的真实高度
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight); //将图形输出到屏幕上
bResult=pPic->Render(hDC_Temp,0,0,nScrWidth,nScrHeight,
0,hmHeight,hmWidth,-hmHeight,NULL); CloseHandle(hFile);//关闭打开的文件
pPic->Release();
// Free memory.
GlobalFree(hGlobal); if (SUCCEEDED(bResult))
{
return S_OK;
}
else
{
AfxMessageBox(_T("图形文件装载出错."));
return E_FAIL;
}
}请问怎么把jpg字节流显示出来呢?
{
IStream * pStream = NULL;
IPicture * pPicture = NULL;
HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLE, size);
LPVOID lpBuf = ::GlobalLock(hMem);
memcpy(lpBuf, (void*)imageBuffer, size);
::GlobalUnlock(hMem); HRESULT hr = ::CreateStreamOnHGlobal(hMem, TRUE, &pStream);
ASSERT (SUCCEEDED(hr));
hr = ::OleLoadPicture(pStream, size, FALSE, IID_IPicture, (LPVOID *)&pPicture ); //得到pPicture接口失败
ASSERT(hr==S_OK);
pPicture->Render(pDc->m_hDC, 0, 0, nSrcWidth, nSrcHeight, 0, nSrcHeight, nSrcWidth, -nSrcHeight, NULL);
pPicture->Release();
GlobalFree(hMem);
}
我在MSDN上查了OleLoadPicture上面Res写了
The stream must be in BMP (bitmap), WMF (metafile), or ICO (icon) format. A picture object created using OleLoadPicture always has ownership of its internal resources (fOwn==TRUE is implied).是不是这个函数只能得到bmp、WMF、ICO格式。
但我通过同样的方法为什么能显示jpg文件呢?方法如下:
HRESULT DisplayPic(CString lpImageFile, HWND hWnd, int nScrWidth, int nScrHeight)
{
HDC hDC_Temp=::GetDC(hWnd); IPicture *pPic;
IStream *pStm; BOOL bResult; HANDLE hFile=NULL;
DWORD dwFileSize,dwByteRead; //打开硬盘中的图形文件
hFile=CreateFile(lpImageFile,GENERIC_READ,
FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile!=INVALID_HANDLE_VALUE)
{
dwFileSize=GetFileSize(hFile,NULL);//获取文件字节数 if (dwFileSize==0xFFFFFFFF)
return E_FAIL;
}
else
{
return E_FAIL;
} //分配全局存储空间
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
LPVOID pvData = NULL; if (hGlobal == NULL)
{
AfxMessageBox(_T("图形文件分配出错."));
return E_FAIL;
} if ((pvData = GlobalLock(hGlobal)) == NULL)//锁定分配内存块
{
AfxMessageBox(_T("内存块锁定出问题"));
return E_FAIL;
} ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把文件读入内存缓冲区 GlobalUnlock(hGlobal); if(CreateStreamOnHGlobal(hGlobal, TRUE, &pStm) != S_OK)
{
AfxMessageBox(_T("流初始化失败"));
return E_FAIL;
} //装入图形文件
bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic); if(FAILED(bResult))
{
AfxMessageBox(_T("图形文件装载出错."));
return E_FAIL;
} OLE_XSIZE_HIMETRIC hmWidth;//图片的真实宽度
OLE_YSIZE_HIMETRIC hmHeight;//图片的真实高度
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight); //将图形输出到屏幕上
bResult=pPic->Render(hDC_Temp,0,0,nScrWidth,nScrHeight,
0,hmHeight,hmWidth,-hmHeight,NULL); CloseHandle(hFile);//关闭打开的文件
pPic->Release();
// Free memory.
GlobalFree(hGlobal); if (SUCCEEDED(bResult))
{
return S_OK;
}
else
{
AfxMessageBox(_T("图形文件装载出错."));
return E_FAIL;
}
}请问怎么把jpg字节流显示出来呢?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货