GDI+ 繪圖時,相同解析度, DPI不同時圖片顯示的問題.
阿新 • • 發佈:2019-02-02
最後在VC中使用GDI+作圖片處理時, 突然發現有幾張圖片顯示不正常,未按實際畫素大小顯示.
程式碼很簡單:
void CTransBmpDlg::OnBnClickedImgTest() { CString strFilter=TEXT("圖片檔案(*.gif,*.jpg,*.bmp)|*.gif;*.jpg;*.bmp||"); CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,strFilter,this); if(IDOK == dlg.DoModal()) { CString Str = dlg.GetPathName(); Image img(Str); HDC hDC = ::GetDC(NULL); Graphics gph(hDC); gph.SetPageUnit(UnitPixel);//此句對DPI不同的圖無效果 gph.DrawImage(&img,0,0); ::ReleaseDC(NULL,hDC); } }
百度,Google未果.
在CSDN中搜索到有人說是因為DPI不同, 而GDI+的DrawImage函式中只帶起點座標,無區域大小的那個過載函式會預設以當前裝置DPI來顯示.
即然是這樣, 就想看看Graphics類中有沒有可以指定繪製圖方式的.
結果就發現了有一個SetPageUnit函式,可以指定繪圖方式,按畫素,或者按DPI等等.
看這個函式還小高興了會, 結果加入程式中一試,發現根本無效果.
最後無奈, 只有使用帶縮放功能的過載DrawImage了,只是傳區域的時候,傳傳圖片的實際畫素大小.
void CTransBmpDlg::OnBnClickedImgTest() { CString strFilter=TEXT("圖片檔案(*.gif,*.jpg,*.bmp)|*.gif;*.jpg;*.bmp||"); CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,strFilter,this); if(IDOK == dlg.DoModal()) { CString Str = dlg.GetPathName(); Image img(Str); HDC hDC = ::GetDC(NULL); Graphics gph(hDC); //gph.SetPageUnit(UnitPixel);//此句對DPI不同的圖無效果 gph.DrawImage(&img,0,0,img.GetWidth(),img.GetHeight()); ::ReleaseDC(NULL,hDC); } }
不知道有沒有其它方法...
如果知道其它方法的,請指點下, 感激不盡.