2010-11-30 7 views
0

私は、次の機能があります。画像をトリミングすることになっていますGraphics.RotateTransform()が適用されないのはなぜですか?

static private Image CropRotate(Image wholeImage, Rectangle cropArea) 
{ 
    Bitmap cropped = new Bitmap(cropArea.Width, cropArea.Height); 

    using(Graphics g = Graphics.FromImage(cropped)) 
    { 
     g.DrawImage(wholeImage, new Rectangle(0, 0, cropArea.Width, cropArea.Height), cropArea, GraphicsUnit.Pixel); 
     g.RotateTransform(180f); 
    } 
    return cropped as Image; 
} 

は、その結果のサブ画像を回転させます。実際には、作物のみを実行します。

なぜRotateTransform()が適用されないのですか?

答えて

5

DrawImage()の前にRotateTransform()を入れてみましたか? example on the msdn pageには、描画が行われる前に適用されている変形が示されています。

+0

奇妙なことに、これは空白の画像になります。 –

+1

私はちょうどこの1つを推測していますが、画像の回転元はどこですか?それが(0,0)にある場合、空のイメージが正しいでしょう。原点を(cropped.Width/2、cropped.Height/2)に設定する必要があります – wangburger

+0

g.RenderingOriginを設定してこれを行うと仮定しますが、まだ空白の画像が表示されます。他のアイデア? –

4

RotateTransform呼び出しは、すべての後に操作に影響する現在の変換行列を変更します。それはではありません。は既に出力操作をまったく変換しません。これは、変換行列を変更する操作(ScaleTransformなど)と同じです。

の前に呼び出すことを確認してください。この場合、変換する操作はDrawImageの前に実行してください。

あなたは((回転または拡大縮小しない)

  1. ドロー
  2. 回し(変更のみが変換行列)
  3. スケールは、(変更のみが変換行列)
  4. ドローのような何かをするためにこれを使用することができます今度は回転してスケーリングします)
  5. ClearTransform(変換行列のみを変更します)
  6. 描画(回転しないまたは拡大縮小しない)

最初の描画出力と最後の描画出力は変換されませんが、中間の出力は回転とスケールの両方で影響を受けます。

関連する問題