3

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

この背後にある全体的な考え方は、回転した.emfファイルをUserControlに表示し、emf図面がUserControlの使用可能なスペースを常に埋めるようにすることです。たぶんもっと良いアプローチがありますか?

私が求めているfillmode/Stretchmodeは、UniformとUniformToFillです(WPFのビューボックスのように)。均一モードでは、emfが歪んではいけません。emfは少なくとも1つの次元でユーザーコントロールを完全に満たし、何もトリミングされません。UniformToFillでは、emfは両方の次元でUserControlを満たし、アスペクト比が一致しない場合、emfは1つの次元でトリミングされます。

4

2 に答える 2

1

私があなたを正しく理解している場合-回転が画像のバウンディングボックスにどのように影響するかを理解して、それに応じて拡大縮小できるようにする必要があります。

次に、次のように実行できます。

  1. バウンディングボックスの4つの座標をPoint[]に詰め込みます。
  2. 回転を使用してマトリックスを設定します(.RotateAt)
  3. 行列で4つの点を変換します。
  4. 変換された4つのX座標を並べ替え、新しい境界ボックスの幅を比較します(並べ替え後、pts [3] .X-pts [0] .X)。
  5. これで、完全にフィットするように幅を拡大縮小する方法がわかりました。
  6. 高さについても手順4を繰り返します。
于 2009-11-23T17:19:45.033 に答える
0

GDIで行われる方法は次のとおりです。

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

GDI+には同等のものがあります-GraphicsPathクラスとRegionクラスは上記を実行できます

于 2009-11-22T18:44:54.390 に答える