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);
	}
}


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


如果知道其它方法的,请指点下, 感激不尽.


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值