关于jpg绘制,查看网上的帖子都是使用 CreateFile 和ReadFile 组合 或者 CFile 类的方法 获取jpg资源加载到内存中的! 但是,在使用fopen ,fread 这个标准c++函数组合读取资源时候却使得 OleLoadPicture(...) 初始化失败,累累报错,网上也是没有正解,经过自己的对三种读取方法的对比,终于看出了些许端倪。这虽然是不起眼的一个问题,但是对于如何将“jpg图片流”或相机视频流,整理成合理格式再绘制到屏幕上却有着决定成败的意义!下面看看代码:
IPicture * m_pPct;
int LoadPct(CString pcFile)//图片的实现方法
{
HANDLE hFile = CreateFile(pcFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
// 获得文件大小
DWORD dwFileSize = GetFileSize(hFile, NULL); //有些偷懒了,初始化CreateFile 只为了 获得 图片大小
LPVOID pvData = NULL;
// 分配全局内存,获得内存句柄
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
// 锁定内存,获得内存指针
pvData = GlobalLock(hGlobal);
DWORD dwBytesRead = 0;
// 读取文件 //向内存指针中存入内容;
CloseHandle(hFile);
////////////////////////////////////// ** 通过 CFile::Read(...) 读取的pvData 其 strlen(pvData) ==4 这是关键。**
//CFile file;
// file.Open( "c://a2.jpg", CFile::modeRead | CFile::shareDenyNone ); // 读入文件内容
// DWORD dwSize = file.GetLength();
// file.Read( pvData, dwSize );
// file.Close();
//////////////////////////////////////
FILE *pf = fopen( "c://a2.jpg" ,"rb" );
char * filebuff = new char[1024*1024];
/////通过CFile读取经验 得知 fread(XX,4,XX,XX) 只有以4个字节为长度的文件才能被OleLoadPicture 正确解析 **关键**
fread( filebuff,4,dwFileSize,pf );
memcpy( pvData,filebuff,dwFileSize);
fclose( pf );
int ix = strlen( (const char*)filebuff );
GlobalUnlock(hGlobal);
LPSTREAM pstm = NULL;
//从内存数据创建IStream*
HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
// 创建IPicture
if (!m_pPct)
{
m_pPct->Release();
}
// 从IStream接口中载入图片到IPicture中
hr = ::OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID *)&m_pPct);
// 释放IStream接口
pstm->Release();
return 1;
}
///////////////////////////////////////////////////////////////////////////////////////////
int CJpegDrawTempDlg::DrawPct()//函数的实现
{
if(m_pPct)
{
CWnd *pWnd;
CDC *pDvc;
CRect rc;
long hmWidth;
long hmHeight;
pWnd = GetDlgItem(IDC_STATIC);
pDvc = pWnd->GetDC();
m_pPct->get_Width(&hmWidth);
m_pPct->get_Height(&hmHeight);
pWnd -> GetClientRect(&rc);
// 拉伸显示
m_pPct->Render(pDvc->GetSafeHdc(), 0, 0,
rc.Width(), rc.Height(), 0, hmHeight, hmWidth, -hmHeight, &rc);
UpdateData(FALSE);
return TRUE;
}
return FALSE;
}