Alternative to Graphics.ScaleTransform



我正在使用GDI+进行自定义绘图。

通常,如果我想让我画的东西适合窗口,我会计算适当的比例,然后按比例缩放所有东西:

e.Graphics.ScaleTransform(ratio, ratio);

ScaleTransform的问题在于它会缩放所有东西,包括笔触和画笔。

我如何缩放我正在绘制的所有像素坐标?每条线、矩形或路径基本上都是一系列的点。所以我可以手动将所有这些点乘以比率,但是有没有更简单的替代方法可以无缝地做到这一点?

首先尝试将所有对象放在GraphicsPath实例中。它没有ScaleTransform方法但是你可以用GraphicsPath.Transform变换对象。您可以通过Matrix.Scale传递缩放矩阵

可以包装GDI图形对象并存储比例因子

interface IDrawing
{
   void Scale(float sx, float sy);
   void Translate(float dx, float dy);
   void SetPen(Color col, float thickness);
   void DrawLine(Point from, Point to);
   // ... more methods
}
class GdiPlusDrawing : IDrawing
{
   private float scale;
   private Graphics graphics;
   private Pen pen;
   public GdiPlusDrawing(Graphics g)
   {
      float scale = 1.0f;
   }
   public void Scale(float s)
   {
       scale *= s;
       graphics.ScaleTransform(s,s);
   }
   public void SetPen(Color color, float thickness)
   {
       // Use scale to compensate pen thickness.
       float penThickness = thickness/scale;
       pen = new Pen(color, penThickness);   // Note, need to dispose.
   }
   // Implement rest of IDrawing
}

我认为ScaleTransform适用于GDI上下文所关注的每个数值,因此不幸的是,您不能仅将其用于坐标。WPF有一个GeometryTransform,但我不知道GDI+中有一个等价的。

如果你担心代码重复,你总是可以写一个实用程序方法来绘制形状,并将一定的比例水平应用于它们的点。

你也可以尝试手动反转ScaleTransform,通过将它的逆应用到任何你不想缩放的对象;我知道有些笔刷会使用这个方法

幸运的是,Pen有一个局部ScaleTransform,通过它可以反向重新缩放来补偿全局变换。钢笔。在使用每次重新缩放之后,在下一次之前进行ResetTransform,或者当前笔缩放(独立于图形上下文)可以缩小到几乎为零(实际上是一个像素),拍摄到月球,或者点在中间。

相关内容

  • 没有找到相关文章

最新更新