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

来源:互联网 发布:ubuntu 17.04 iso安装 编辑:程序博客网 时间:2024/06/07 06:13
方式一:注意开始的时候要在对话框上设置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);

原创粉丝点击