2012-01-09 88 views
1

我想要做的是基本上從圖像裁剪矩形。但是,它應該滿足一些特殊情況:使用c從圖像裁剪十字矩形#

  1. 我想在圖像上裁剪出一個有角度的矩形。
  2. 我不想旋轉圖像並裁剪一個矩形:)
  3. 如果裁剪超出圖像大小,我不想裁剪空白背景色。

我想從起點的後面裁剪,當矩形大小完成時,它將在起點處結束。我知道我無法解釋,因此,如果我表現出我想要的視覺:

enter image description here

藍點是起點,在那裏,箭頭所示方向裁剪。當裁剪超出圖像邊界時,它將回到起點的後面,當矩形的寬度和高度完成時,矩形的末端將位於起點處。

除了這是以前的問題,我問:

在這個問題上,我無法預測可能發生的有關圖像尺寸的問題,所以我沒有問它。但現在有案例3.除案例三外,這與問題完全相同。我該怎麼做,有什麼建議?

+1

你爲什麼不想要旋轉的影像和作物是什麼?這顯然不應該是可見的,只需複製你的原始圖像。 – TJHeuvel 2012-01-09 08:32:22

+0

添加一些調整大小的步驟,解釋仍然很複雜。 – CodingBarfield 2012-01-09 08:42:13

+0

@TJHeuvel我完全不明白你所說的。旋轉圖像會改變尺寸,所以起點的位置也會改變。這就是爲什麼我不想旋轉圖像 – user1125953 2012-01-09 08:45:41

回答

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 2012-01-09 13:43:43