none
GDI+ BMP和PANEL绘图差异 RRS feed

  • 问题

  • 使用BMP绘图后载入Panel的BackgroundImage与直接在Panel上绘图差异很大:
    第一副是通过Graphics绘制到Bitmap后赋值给Panel
    第二幅是直接在Panel的Paint事件中对Panel进行绘图
    第一副解决了闪烁问题,但是图像却非常不清楚,什么原因呢?

    2014年5月12日 9:15

答案

  • 设置graphics.TextRenderingHint 使文字平滑显示。多种抗锯齿模式可以选择。

    • 已标记为答案 Lannykid 2014年5月12日 9:51
    2014年5月12日 9:50
  • 第一幅图看起来像是经过缩放了,你可以检查一下panel的BackgroundImageLayout属性,看是否设置成了Stretch或者Zoom。

    另外,要解决闪烁问题的话,可以尝试给panel设置双缓冲,如果是在继承自Panel的自定义控件里面画图,在控件的构造函数里面放入以下代码即可设置双缓冲:

    this.DoubleBuffered = true;

    如果不是继承的控件,而是直接在panel上画图的话,在放有panel的窗体的构造函数中加入以下代码即可设置双缓冲:(假设panel名为panel1):

    typeof(Control).GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(panel1, true, null);

    然后在画图时,先把图片画到Bitmap里面,再在Paint事件里面把用DrawImage方法把Bitmap整个画上去即可。

    • 已标记为答案 Lannykid 2014年5月22日 1:03
    2014年5月12日 10:04

全部回复

  • 设置graphics.TextRenderingHint 使文字平滑显示。多种抗锯齿模式可以选择。

    • 已标记为答案 Lannykid 2014年5月12日 9:51
    2014年5月12日 9:50
  • 第一幅图看起来像是经过缩放了,你可以检查一下panel的BackgroundImageLayout属性,看是否设置成了Stretch或者Zoom。

    另外,要解决闪烁问题的话,可以尝试给panel设置双缓冲,如果是在继承自Panel的自定义控件里面画图,在控件的构造函数里面放入以下代码即可设置双缓冲:

    this.DoubleBuffered = true;

    如果不是继承的控件,而是直接在panel上画图的话,在放有panel的窗体的构造函数中加入以下代码即可设置双缓冲:(假设panel名为panel1):

    typeof(Control).GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(panel1, true, null);

    然后在画图时,先把图片画到Bitmap里面,再在Paint事件里面把用DrawImage方法把Bitmap整个画上去即可。

    • 已标记为答案 Lannykid 2014年5月22日 1:03
    2014年5月12日 10:04
  • tupian meiyou 图片没有缩放,图是直接画上去的,感觉重影是因为没有对图进行抗锯齿。

    双缓冲是个好方法,我实用一个bitmap做buffer的。请问直接设置DoubleBuffered和用bitmap做buffer原理上是一样的吗?

    感谢~

    2014年5月22日 1:06