1. 程式人生 > >GDI+ 繪圖時,相同解析度, DPI不同時圖片顯示的問題.

GDI+ 繪圖時,相同解析度, DPI不同時圖片顯示的問題.

最後在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);
	}
}


不知道有沒有其它方法...

如果知道其它方法的,請指點下, 感激不盡.