我用gdi+在屏幕上显示一张图片,图片的尺寸会变大? 不知道如何解决?比如,我开一个200x200的窗口,从(0,0)的位置显示一张200X200的jpg.
但图片的尺寸会变大,使图片的右边和下边超出窗口。不知大家有没有遇见同样的问题? 是如何解决的?

解决方案 »

  1.   

    zfive5 为什莫呢?能不能再说的清楚一些?(难道跟bmp的pitch有关?)而且,这也不是最佳的解决方式吧?
    难道其他尺寸的图片就一定要变形?
      

  2.   

    jpg的最小单位是8*8的一个块,可能是
    Y:U :V=4:1:1
    所以必须是16*16你可以看看jpeg图像的格式,到网上去搜一下
      

  3.   

    非常感谢zfive5 的解释。
    但是:
    1. 我把图片和窗口的宽高都改为16的倍数。 y方向没有缩放了,但X方向依然被拉长了.
    2. 在gdi+方式下,只能贴16倍数尺寸的jpg图片? 总感觉不太对吧?不知道 有没有彻底的解决方式?
      

  4.   

    根据你开窗口的大小以及获取到图片的大小,进行合适的缩放就OK啦
    // 程序: FitSize(CSize toFit,CSize room)
    // 说明: 实现图像窗口的自适应,如果图像小于窗口,就图像大小为原大小,如果
    //       图像大于窗口,根据高宽来定比例,以适就窗口大小
    // 返加: 新的图像大小
    // 日期: 2004-04-18
    // 程序员: 武志文
    /////////////////////////////////////////////////////////////////////////////
    CSize CPicEditCtrl::FitSize(CSize toFit, CSize room)
    {
    if (toFit.cx > room.cx || toFit.cy > room.cy) // 图像大于窗口
    // 小图像保留原大小
    {
    if (toFit.cx * room.cy > room.cx * toFit.cy) // width determines scale
    {
    toFit.cy = MulDiv(toFit.cy, room.cx, toFit.cx);
    toFit.cx = room.cx;
    }
    else // height determines scale
    {
    toFit.cx = MulDiv(toFit.cx, room.cy, toFit.cy);
    toFit.cy = room.cy;
    }
    }
    return toFit;
    }//////////////////////以下为示例部份
    CRect rcClient;
    GetClientRect(rcClient); // If necessary, scale down to fit picture in rcClient
    CSize szPic = FitSize(CSize(pPicture->GetWidth(), pPicture->GetHeight()), rcClient.Size()); // Center in window and cache in GDI+ rect
    CRect rcImage(CPoint(0, 0), szPic);
    CSize szOffset = rcClient.CenterPoint() - rcImage.CenterPoint(); m_rect.X = szOffset.cx;
    m_rect.Y = szOffset.cy;
    m_rect.Width = szPic.cx;
    m_rect.Height = szPic.cy;
      

  5.   

    问题解决:

    g.DrawImage ( &Img , Point ( 0,0 ) ) ; 
    改为:
    g.DrawImage ( &Img , 0,0 , BK_W , BK_H ) ; 
    强行设置宽高。
    这末简单的方法,竟然让我痛苦了好几天,我开始对我的智商表示深刻怀疑。不过,仍然没有找到为什末默认的情况下,宽高会变化,怀疑与dpi有关,未果。
    还望高人指点。
      

  6.   

    先结贴。
    wuzhiwen说的不是我困惑的问题,但同样感谢。在gdi下贴图不会有问题,在gdi+下却有。