MFC在Picture控件上顯示圖像、保存圖像


    //選擇圖片
    CFileDialog fileDlg(TRUE, _T("png"), NULL, 0, _T("image Files(*.bmp; *.jpg;*.png)|*.JPG;*.PNG;*.BMP|All Files (*.*) |*.*||"), this);
    //打開文件選擇窗體
    if (fileDlg.DoModal() == IDCANCEL) return; //如果點擊“取消”按鈕,直接退出
    //獲取圖片路徑(包含名稱)
    CString strFilePath = fileDlg.GetPathName();//既有路徑又有文件名,如D:/lena.jpg
    //CString strFileName = fileDlg.GetFileName();//只獲取文件名,如lena.jpg
    //判斷路徑不為空
    if (strFilePath == _T(""))
    {
        return;
    }
    //使用CImage的Load、Draw函數顯示圖像
    CImage image;
    image.Load(strFilePath);

    //int x = image.GetWidth(); //學習下CImage的屬性,無其他意義
    //int y = image.GetHeight();

    //獲取控件的矩形
    CRect rectControl;  //控件矩形對象
    CWnd  *pWnd = GetDlgItem(IDC_IMAGE); //Picture Control的ID為IDC_IMAGE
    pWnd->GetClientRect(&rectControl);

    //以控件為畫布,在其上畫圖
    CDC *pDc = GetDlgItem(IDC_IMAGE)->GetDC();
    SetStretchBltMode(pDc->m_hDC, STRETCH_HALFTONE);//繪圖前必須調用此函數(設置縮放模式),否則失真嚴重

    //畫圖(以下兩種方法都可)
    //image.StretchBlt(pDc->m_hDC, rectPicture, SRCCOPY); //將圖片繪制到Picture控件表示的矩形區域
    image.Draw(pDc->m_hDC, rectControl);                //將圖片繪制到Picture控件表示的矩形區域

    image.Destroy();
    pWnd->ReleaseDC(pDc);

顯示與保存(顯示與上述一樣),m_PictureControl是PictureControl控件對應的變量。

顯示

    // **************** 獲取圖片
    CFileDialog fileDlg(TRUE, _T("bmp"), NULL, 0, _T("image Files(*.bmp; *.jpg;*.png)|*.JPG;*.PNG;*.BMP|All Files (*.*) |*.*||"), this);
    fileDlg.DoModal();
    //獲取圖片路徑和圖片名稱
    CString strFilePath = fileDlg.GetPathName(); //"D:\1.jpg"
    //CString strFileName = fileDlg.GetFileName(); //"1.jpg"
    //判斷路徑是否為空
    if (strFilePath == _T(""))
    {
        return;
    }
    //CImage image; //使用圖片類,已放到頭文件中(全局變量)
    if(!image.IsNull()) 
        image.Destroy(); //如果已有,先清空。否則重新加載會報錯。
    image.Load(strFilePath); //裝載路徑下圖片信息到圖片類
    //******************* 圖片縮放適應控件大小
    CRect rectControl;                        //控件矩形對象    
    m_PictureControl.GetClientRect(&rectControl);//控件區域
    //圖片不縮放
    //int imageWidth = image.GetWidth();
    //int imageHeight = image.GetHeight();
    //rectControl = CRect(rectControl.TopLeft(), CSize(imageWidth, imageHeight)); //顯示未縮放原圖,超出控件區域不顯示
    
    //顯示
    CDC *pDc = m_PictureControl.GetWindowDC();//獲得顯示控件的DC
    SetStretchBltMode(pDc->m_hDC, STRETCH_HALFTONE); //設置縮放,否則圖片顯示會失真
    image.Draw(pDc->m_hDC, rectControl);   //將圖片繪制到Picture控件表示的矩形區域

    //釋放資源
    ReleaseDC(pDc);

保存

    if (image.IsNull()) 
    {
        MessageBox(_T("你還沒有打開一個要保存的圖像文件!"));
        return;
    }
    CString strFilter;
    strFilter = _T("位圖文件|*.bmp|JPEG 圖像文件|*.jpg|PNG 圖像文件|*.png||");
    CFileDialog dlg(FALSE,_T("bmp"),_T("untitled.bmp"),NULL,strFilter);
    if ( IDOK != dlg.DoModal())
        return;
    
    // 文件名
    CString strFileName;
    strFileName = dlg.m_ofn.lpstrFile;// 如"D:\1.jpg"

    // 圖像保存
    HRESULT hResult = image.Save(strFileName);
    if (FAILED(hResult))
        MessageBox(_T("保存圖像文件失敗!"));

 

【參考】

MFC——CDC

https://blog.csdn.net/u013919153/article/details/99407029


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM