GDI +,大翻译值和图形基元的扭曲渲染

时间:2014-04-18 01:04:07

标签: gdi+

S.O.的长期用户,但是第一次张贴海报。请温柔。 :)

使用.NET的GDI +(任何版本的Framework,从2.0到4.5.1),当在' Graphics&上渲染具有大翻译值的图形基元时,我会遇到非常奇怪的行为#39;宾语。这是一段非常简单的代码,用于演示问题...只需粘贴到Windows窗体中并运行:

 Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    e.Graphics.TranslateTransform(183946953, 82803840)

    Dim r As Rectangle = New Rectangle(New Point(-183946600.0, -82803570.0), New Size(0, 0))
    r.Inflate(25, 25)

    e.Graphics.FillEllipse(Brushes.Red, r)
    e.Graphics.DrawEllipse(Pens.Black, r)
End Sub

生成的椭圆严重失真。并且转换值越高,失真越严重。

有谁知道为什么GDI +会这样做?

感谢。

1 个答案:

答案 0 :(得分:1)

内部GDI +对某些操作使用固定点坐标表示。您可能会遇到坐标整数部分的24位限制。解决方法是避免翻译:没有人能看到在这些坐标处绘制的任何东西。如果要进行平移以便渲染到打印机或位图,则需要缩小所有坐标。