最后在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了,只是传区域的时候,传传图片的实际像素大小.
不知道有没有其它方法...如果知道其它方法的,请指点下, 感激不尽.

解决方案 »

  1.   

    gph.DrawImage(&img,0,0, img.width(), image.height());试试
    SetPageUnit(UnitPixel)只是设置逻辑单位的单位(如像素,英寸)
      

  2.   

    我现在就是使用的这个方法,并且还要加上设置缩放质量的函数.我是想问,还有没有其它方法, 我看了一遍Graghics类的函数, 似乎没看见有,
    也可能是我的E文水平不行吧,
      

  3.   

    最近DPI的问题似乎不少,关注一下.
      

  4.   

    对DPI不同的图无效果,是指第二次调用不同的DPI图形不起作用么?
      

  5.   

    用CDC::GetDeviceCaps读LOGPIXELSX,获得设备的逻辑像素密度。
    再看看http://msdn.microsoft.com/en-us/library/windows/desktop/ms535366.aspx
    用GetProperty*几个函数取得JPEG文件的DPI信息,具体的属性名字看GdiPlusImaging.h,一般是PropertyTagXResolution、PropertyTagResolutionUnit之类的这些,用两个值相除,得到缩放的比例。
    上面是对于显示器而言的,如果是打印机,X、Y的DPI可能不同,需要分别处理。
      

  6.   

    SetPageUnit对于这个没用。因为两个图片的单位都是pixel,SetPageUnit不能设置DPI。
    Windows的GDI+好像没有考虑不同图像的DPI,像GDI就是直接忽略位图的DPI。
    你似乎只能手动进行缩放。
      

  7.   

    无效果的意思是: 调用了这此函数, 图像显示还是按DPI缩放后显示的, 并不是按像素显示.以前都没有注意过DPI的问题, 是有程序使用过程中,突然发现有几张图显示的大小不对. 百度,Google了好久, MSDN也看了N遍.都没有相关说明.
    最后是无意间在某个搜索结果中看到说是DPI的问题. 我开始还以为是GDI+的Bug呢.再等等,没人回答就结帖,散分了.