关于 MFC 绘制 JPG图像 问题 -- 无敌使用fread 获取图像到内存中

本文探讨了使用不同方法加载JPG图片的问题,并解决了fopen和fread导致OleLoadPicture初始化失败的问题。通过对比CreateFile和ReadFile、CFile类及标准C++函数组合,找到了正确读取和解析JPG图片流的关键。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      关于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; 
 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值