none
DrawImage在绘制图片的时候,为什么会擅自改变图片的大小? RRS feed

  • 问题

  • 我有一个PNG图片,大小是8X8像素,添加到项目的资源里面。然后在Paint事件中使用如下代码绘制到表单上:

    Point pt = new Point(10,10);
    e.Graphics.DrawImage(Properties.Resources.top, pt.X, pt.Y, new Rectangle(0, 0, 8, 8), GraphicsUnit.Pixel);

    画出来的效果,经过我用放大镜仔细判断,发现实际“画”在表单上的图片宽度变成了11个像素,莫名其妙多了三个像素的宽度出来,这究竟是为什么?



    图片是下面这个(8X8):

     

     



    • 已编辑 liubin 2012年1月7日 19:03
    2012年1月7日 18:48

答案

全部回复

  • 請您參考一下以下的link  ,謝謝! 希望對您有幫助。

    e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;

    or

    e.Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;

     

    GDI+ DrawImage(Bitmap, ...) stretch problem

     


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    2012年1月8日 3:00
  • 试过了,没用。。。。

    换了个大一点的图片,情况更加严重了:

     

    上面那个是png图片在ACDSee查看的效果,下面那个是绘制在Form里面的效果,可以看出明显长了很多。。。

     

     

    换成VS2010也一样:

     

     

    长了很多。。。。

     

    这是不是超级大BUG!?


    da jia hao!
    • 已编辑 liubin 2012年1月8日 3:42
    2012年1月8日 3:38
  • 我直接用您先前的Code,Run起來圖一樣大呢! Vs2010 Sp1


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    2012年1月8日 11:23
  • 你用这个图片就不行了:

      <左边的这个小图片,比较小,注意下。

    图片在IE里面直接打开,或者在其他图像软件里面打开,甚至在VS自己的资源管理器里面查看都是完全正常的。

    就是在用DrawImage画出来之后变样了。。。。


    da jia hao!
    2012年1月9日 12:00
  • 奇怪,为什么我测试的结果是正常的呢,一样的代码,VS2010, .Net Framework 4.0.

    您的程序在别的电脑上也是同样的问题吗?

    如果方便的话,请发给我一个测试project,我运行一下试试看: rocky_msn@hotmail.com

    谢谢先。


    Best Regards,
    Rocky Yue[MSFT]
    MSDN Community Support | Feedback to us
    2012年1月10日 4:07
    版主
  • 要把project 放在skydrive上給download一下嗎? Thanks.
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    2012年1月10日 5:26
  • 请问你是用我提供的图片来画的吗?我怀疑是和图片有关系,因为我从网上下载的图片不会有这个问题。

    这个图片是我自己在PhotoShop里面制作的。

     

    另外问一下,Skydrive怎么用?是免费的吗?怎么申请?

     


    da jia hao!
    • 已编辑 liubin 2012年1月10日 7:52
    2012年1月10日 7:52
  • 我的图片是从系统的画图工具画出来的。

    Skydrive可以这么用的: https://skydrive.live.com/

    用MSDN的用户名和密码登录就可以了。

    PS:免费的。


    Best Regards,
    Rocky Yue[MSFT]
    MSDN Community Support | Feedback to us

    2012年1月10日 7:58
    版主
  • 请使用这个图片来画:

     

     

    代码就一句DrawImage,画出来之后你会发现比原来的大很多。。。。


    da jia hao!
    2012年1月10日 19:07
  • 嗯,使用這個檔案的確是會變大!

    但如果用小畫家另存成png檔的話,就不會有這個情形。

    您的那個檔案是用什麼Tool做出來的呢?


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    2012年1月10日 23:11
  • 用这个图片还真会变大,但是我用画图工具打开再保存一下,然后就不会变大,和原来的一样了。

    估计是用其他工具生成或者保存图片的时候图片的分辨率不同导致的。设置一下图片的分辨率就好了:

     

      private void Form1_Paint(object sender, PaintEventArgs e)
            {
                Point pt = new Point(10, 10);
                Bitmap bit = new Bitmap(Properties.Resources.save1);
                bit.SetResolution(96.0F, 96.0F);
                e.Graphics.DrawImage(bit, pt.X, pt.Y, new Rectangle(0, 0, 169,32), GraphicsUnit.Pixel);
            }
    

    参考资料:http://msdn.microsoft.com/zh-cn/library/system.drawing.bitmap.setresolution.aspx

     或者先直接转换到Bitmap就好了。

     


    Best Regards,
    Rocky Yue[MSFT]
    MSDN Community Support | Feedback to us

    2012年1月11日 2:40
    版主
  • 谢谢大家。我已经确认是图片问题了。图片是在PhotoShop里面做的。

    不过,由于所有的图像软件,都能够正确显示这个图片,唯独.net不行,如果你说这不是.net的bug,无论如何都说不过去的吧!?


    da jia hao!
    2012年1月11日 5:23
  • 建议你去这个地方提交个bug:

    http://connect.microsoft.com/

     


    Best Regards,
    Rocky Yue[MSFT]
    MSDN Community Support | Feedback to us
    2012年1月11日 5:26
    版主
  • 小弟發現,您用另外的寫法就可以了呢! 您試一下吧!

    e.Graphics.DrawImage(Properties.Resources.top, pt.X, pt.Y, new Rectangle(0, 0, 8, 8), GraphicsUnit.Pixel);

    =>

    e.Graphics.DrawImage(Properties.Resources.top , pt.X, pt.Y, 8, 8);

    Graphics.DrawImage 方法


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年1月12日 1:46