2009-11-22 97 views
3

我从MetaFile(emf)绘制图像,然后在UserControl的OnPaint中对其应用一些旋转变换。应用那些转换后,我怎样才能计算出这个在屏幕坐标中的正常未转换的矩形边界框?我需要这个能够将旋转的图像调整到UserControl的大小。计算GDI +绘图的边界框

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); 
} 

这背后的整个想法是,我想要显示的.emf在用户控件文件旋转并具有电动势绘图永诺填写用户控件的可用空间。也许有更好的方法?

我后面的fillmode/stretchmode是Uniform和UniformToFill(就像在WPF的Viewbox中一样)。 emf不应该在Uniform模式下被扭曲,emf至少在一个维度上完全填充usercontrol,没有任何东西被裁剪。在UniformToFill中,emf填充两个维度中的UserControl,并且如果宽高比不匹配,emf将在一个维度上裁剪。

+0

你想如何“填补”?如果emf完全覆盖usercontrol(emf的某些部分应该裁剪)还是应该调整大小以便所有的emf都可见 - 留下部分用户控件? emf应该保持原始的宽高比吗? – 2009-11-23 07:47:46

+0

我后面的fillmode/stretchmode是Uniform和UniformToFill(就像在WPF的Viewbox中一样)。 emf不应该在Uniform模式下被扭曲,emf至少在一个维度上完全填充usercontrol,没有任何东西被裁剪。在UniformToFill中,emf填充两个维度中的UserControl,并且如果宽高比不匹配,emf将在一个维度上裁剪。 – bitbonk 2009-11-23 09:52:27

回答

1

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

然后,你可以这样做:

  1. 东西四大您边框的坐标在点[]。
  2. 设置您的旋转矩阵(.RotateAt)
  3. 让矩阵变换四个点。
  4. 对四个转换的X坐标进行排序并比较新的边界框的宽度(pts [3] .X - pts [0] .X排序后)。
  5. 现在您已经知道如何缩放宽度以获得最佳配合。
  6. 重复步骤4的高度。
+0

我的图画不一定是矩形的。例如,如果图形是一个圆,那么旋转本身不会影响比例因子。 – bitbonk 2009-11-23 17:36:33

+0

然后,您需要为图像中的每个*角落*执行上述操作。当然,圆圈必须是近似的,并且被认为是由多个线段组成。 – 2009-11-23 17:48:09

+0

我想知道,WPF(可能在DWM层的某处)如何做到这一点。 – bitbonk 2009-11-24 06:26:25

0

,将与GDI做的方式是:

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

GDI +具有等同 - 的的GraphicsPath和地区类可以正确地做到以上

+0

我的绘图来自Metafile,所以我认为GraphicsPath不适用。 – bitbonk 2009-11-22 19:05:58

+0

元文件只是GDI调用的序列化,所以它应该可以与GraphicsPath一起使用。 无论如何,MetaFile类有一个GetMetafileHeader方法,您可以获取图元文件边界框并使用三角函数来获取旋转的大小。 – 2009-11-22 19:26:45

+0

那么GraphicsPath没有AddMetaFile或AddDrawing或类似的方法。 – bitbonk 2009-11-22 19:30:01