2012-01-09 10 views
1

基本的には、画像から矩形を切り抜くことです。しかし、いくつかの特殊なケースを満たす必要があります:c#を使用して画像から十字形を切り出す

  1. 画像に斜めの矩形を切り抜きたいと思います。
  2. 画像を回転して矩形をクロップしたくないです。
  3. クロッピングが画像のサイズを超える場合、空の背景色をトリミングしたくありません。

矩形サイズが完成した時点で開始点の後ろから切り抜きたいと思います。

enter image description here

を青い点が出発点であり、矢印はトリミング方向を示しています。私は私が視覚的に欲しいものを示しているので、もし私がうまく説明できなかった知っています。画像の枠線を越えるトリミングは、開始点の奥に戻ります。矩形の幅と高さが終了すると、矩形の終わりが始点になります。このほかに

は、私は尋ねた以前の質問です:この質問で

を私が聞いていなかったので、私はこの問題は、画像の大きさについて発生する可能性があることを予測することができませんでしたそれ。しかし今はケース3があります。ケース3を除いて、これはまったく同じ質問です。どのように私はこれを行うことができます、任意の提案?

+1

は、なぜあなたは、画像を回転させて、それをトリミングしたくありませんか?これは明らかに目に見えてはいけません。元の画像のコピーを作成するだけです。 – TJHeuvel

+0

さらに追加ステップをサイズ変更すると、説明はまだ複雑です。 – CodingBarfield

+0

@TJHeuvelあなたが言ったことを正確に理解できませんでした。画像を回転すると、開始点の位置も変更されるようにサイズが変更されます。だから私は画像を回転させたくないのです。 – user1125953

答えて

1

マトリックス整列にオフセットを追加する必要があります。この場合、私は各辺から長方形の1つの余分な長さ(合計9矩形)を取り、毎回行列をオフセットしています。

オフセット0(元の切り抜き)を最後に配置する必要があることに注意してください。間違った結果が得られます。

また、回転した画像よりも大きな四角形を指定すると、空の領域が残ることにも注意してください。あなたの例を再作成する

public static Bitmap CropRotatedRect(Bitmap source, Rectangle rect, float angle, bool HighQuality) 
{ 
    int[] offsets = { -1, 1, 0 }; //place 0 last! 
    Bitmap result = new Bitmap(rect.Width, rect.Height); 
    using (Graphics g = Graphics.FromImage(result)) 
    { 
     g.InterpolationMode = HighQuality ? InterpolationMode.HighQualityBicubic : InterpolationMode.Default; 
     foreach (int x in offsets) 
     { 
      foreach (int y in offsets) 
      { 
       using (Matrix mat = new Matrix()) 
       { 
        //create the appropriate filler offset according to x,y 
        //resulting in offsets (-1,-1), (-1, 0), (-1,1) ... (0,0) 
        mat.Translate(-rect.Location.X - rect.Width * x, -rect.Location.Y - rect.Height * y); 
        mat.RotateAt(angle, rect.Location); 
        g.Transform = mat; 
        g.DrawImage(source, new Point(0, 0)); 
       } 
      } 
     } 
    } 
    return result; 
} 

Bitmap source = new Bitmap("C:\\mjexample.jpg"); 
Bitmap dest = CropRotatedRect(source, new Rectangle(86, 182, 87, 228), -45, true); 
+0

私の画像には、私のデータセットにまだ奇妙な結果が残っています。しかしそれに応じてそれを開発するのは私の責任です。方法は素晴らしいです:)。非常に@Rotemありがとう – user1125953

関連する問題