MFC中怎样读取一个JPG文件或BMP位图文件

时间:2021-06-04 11:48:32
方式一:
注意开始的时候要在对话框上设置Picture控件 ,ID=IDC_PHOTO,定义
HBITMAP m_hPhotoBitmap为该对话框的数据成员

void CTestDlg::OnPaint()
{


  CPaintDC dc(this);
    CStatic *pStaic = (CStatic*)GetDlgItem(IDC_PHOTO);//获取ID为IDC_PHOTO控件的指针
    CBitmap bmp;                            //定义位图变量
    bmp.Attach(m_hPhotoBitmap);    
    BITMAP bm;                                //定义一个位图结构
    bmp.GetBitmap(&bm);                        
    CDC dcMem;
    dcMem.CreateCompatibleDC(GetDC());        //创建一个兼容的DC
    CBitmap *poldBitmap=(CBitmap*)dcMem.SelectObject(bmp); //将位图选入设备环境类
    CRect lRect;                            //定义一个区域
    pStaic->GetClientRect(&lRect);            //获取控件的客户区域
    lRect.NormalizeRect();
    pStaic->GetDC()->StretchBlt(lRect.left ,lRect.top ,lRect.Width(),lRect.Height(),
        &dcMem,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY); //显示位图
    dcMem.SelectObject(&poldBitmap); //将原有的句柄?
}
然后:
void CTestDlg::OnOK()

{
    CRect Rect;                            //定义一个区域
    GetDlgItem(IDC_PHOTO)->GetWindowRect(&Rect);//获取区域
    ScreenToClient(&Rect);        //将屏幕坐标转换为客户坐标        
    
        CFileDialog FileDlg(TRUE, "BMP", NULL,        //定义文件对话框
            OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "位图文件(*.BMP)|*.BMP||");
        if(FileDlg.DoModal() != IDOK)            //打开文件对话框
            return ;
        CString pathname = FileDlg.GetPathName();//获取选中文件的路径
        CFile file;                        //定义一个文件变量
        if(!file.Open(pathname, CFile::modeRead) )//以制度的方式打开文件
            return ;
    DWORD    m_nFileLen = file.GetLength();//获取文件的长度
    char*m_pBMPBuffer = new char[m_nFileLen + 1];//开辟符数组
        if(!m_pBMPBuffer)            //如果控件不够大
            return ;
        if(file.ReadHuge(m_pBMPBuffer,m_nFileLen) != m_nFileLen)//读取文件保存在字符数组中
            return ;
        LPSTR                hDIB,lpBuffer = m_pBMPBuffer;
        LPVOID                lpDIBBits;
        BITMAPFILEHEADER    bmfHeader;//保存bmp文件头的信息
        DWORD                bmfHeaderLen;//保存文件头的长度
        
        bmfHeaderLen = sizeof(bmfHeader);//读取文件头的长度
        strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);//文件的赋值
        if (bmfHeader.bfType != (*(WORD*)"BM"))//如果文件类型不对
            return ;
        hDIB = lpBuffer + bmfHeaderLen;    //将指针移动到文件头的后面
        BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB ;//读取bmp文件的数据
        BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
        lpDIBBits=(lpBuffer)+((BITMAPFILEHEADER *)lpBuffer)->bfOffBits;
        
        CClientDC dc(this);
        m_hPhotoBitmap = CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);
        
    //显示位图到指定的Picture控件上

    //在ON_PAINT()消息响应函数中实现
     Invalidate(TRUE);
}

方式二:

CFileDialog fileOpenDlg(TRUE, "bmp", "*.bmp", NULL, "Bitmap Files(*.bmp)", NULL);
 int nRespond = fileOpenDlg.DoModal();
 if(nRespond == IDOK)
 { CString filePath = fileOpenDlg.GetPathName();
  m_pDib = new CDib(filePath);
  if(m_pDib->IsValid())
  { SetWindowText(filePath);
   drawpicture();  }
  else
  { if (m_pDib)
   {   delete m_pDib;
                m_pDib = NULL;
   }
  } }
CClientDC dc(this);CDib* pDib = m_pDib;
 if(pDib)
 {   RefreshWindow();
  //获取位图的宽度和高度
  m_nWidth = (int)pDib->GetWidth();
  m_nHeight = (int)pDib->GetHeight(); 
  //创建设备兼容位图
  CDC memDC;
  memDC.CreateCompatibleDC(&dc);
  CBitmap* pOldBitmap = memDC.SelectObject(&m_bitmap);
  pDib->Draw(memDC.m_hDC, 1,1, m_nWidth, m_nHeight, 0, 0, m_nWidth, m_nHeight, DIB_RGB_COLORS, SRCCOPY);
  int nOldBkMode = memDC.SetBkMode(TRANSPARENT);  
  dc.BitBlt(0, 0, 800, 600, &memDC, 0, 0, SRCCOPY);
  memDC.SelectObject(pOldBitmap);
  memDC.SetBkMode(nOldBkMode);
 }
  if(m_bitmap.GetSafeHandle()) m_bitmap.DeleteObject();
CClientDC dc(this);
 //创建设备兼容位图
 CRect clientRect;
   m_img.MoveWindow(CRect(0,0,m_pDib->GetWidth()+3,m_pDib->GetHeight()+3));
   m_img.GetClientRect(&clientRect); 
 m_bitmap.CreateCompatibleBitmap(&dc,clientRect.Width(),clientRect.Height());
 CDC memDC;
 memDC.CreateCompatibleDC(&dc);

 CBitmap* pOldBitmap = memDC.SelectObject(&m_bitmap);

 memDC.SelectObject(pOldBitmap);
 ReleaseDC(&dc);