2009-11-22 94 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