//選擇圖片 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("保存圖像文件失敗!"));
【參考】