计算GDI +绘图的边界框

时间:2009-11-22 18:36:57

标签: c# gdi+ resize bounding-box

我正在从MetaFile(emf)中绘制一个图像,然后在UserControl的OnPaint中对它进行一些旋转变换。应用这些变换后,如何在屏幕坐标中计算出这个正常的未变换矩形边界框?我需要这个能够将旋转的图像调整为UserControl的大小。

protected override void OnPaint(PaintEventArgs e)
{
    // rotate around the center of this UserControl
    e.Graphics.TranslateTransform(this.Width / 2.0f, this.Height / 2.0f);
    e.Graphics.RotateTransform(this.Rotation);
    e.Graphics.TranslateTransform(this.Width / -2.0f, this.Height / -2.0f);

    // TODO: now scale so the image so it fits exactly into this UserControl

    // draw the image at the center of this UserControl
    float left = (this.Width - ResourceManager.MyDrawingMetaFile.Width) / 2.0f;
    float top = (this.Height - ResourceManager.MyDrawingMetaFile.Height) / 2.0f;
    e.Graphics.DrawImage(Resources.MyDrawingMetaFile, left, top);
}

这背后的整个想法是我想在UserControl中显示旋转的.emf文件,并且emf绘图总是填充UserControl中的可用空间。也许有更好的方法?

我所追求的fillmode / stretchmode是Uniform和UniformToFill(就像在WPF的Viewbox中一样)。 emf不应该在Uniform模式下失真,emf至少在一个维度上完全填充用户控件,没有任何东西被裁剪。在UniformToFill中,emf会在两个维度上填充UserControl,如果aspectratios不匹配,则会在一个维度上裁剪emf。

2 个答案:

答案 0 :(得分:1)

如果我理解正确 - 您需要弄清楚旋转如何影响图像的边界框,以便您可以相应地缩放它。

然后你可以这样做:

  1. 在Point []中填充边界框的四个坐标。
  2. 使用您的轮播设置矩阵(.RotateAt)
  3. 让矩阵转换四个点。
  4. 对四个变换后的X坐标进行排序,并比较新边界框的宽度(排序后为pts [3] .X - pts [0] .X)。
  5. 现在您知道如何缩放宽度以获得完美契合度。
  6. 同样重复步骤4。

答案 1 :(得分:0)

使用GDI的方式是:

BeginPath()
// Draw stuff
EndPath()
PathToRegion()
GetRgnBox()

GDI +具有等价物 - GraphicsPath和Region类可以执行上述操作