2012-01-11 43 views
1

我試圖通過從中間裁剪來將肖像圖像裁剪成特定的景觀尺寸,而我似乎在做錯事。現在,我有以下代碼:我的裁剪邏輯有什麼問題?

// Check the orientation 
if(original.Height > original.Width) { 
    var bmp = new Bitmap(original); 
    int cropHeightOffset = (desiredHeight - original.Height)/2; 
    var totalArea = new Rectangle(new Point(0, 0), 
            new Size(original.Width, original.Height)); 
    var cropArea = new Rectangle(new Point(0, cropHeightOffset), 
           new Size(desiredWidth, desiredHeight)); 

    // Create new blank image of the desired size 
    var newBmp = new Bitmap(bmp, new Size(desiredWidth, desiredHeight)); 

    // Crop image 
    var cropper = Graphics.FromImage(newBmp); 

    // Draw it 
    cropper.DrawImage(bmp, totalArea, cropArea, GraphicsUnit.Pixel); 

    // Save 
    original.Dispose(); 
    newBmp.Save(imagePath, ImageFormat.Jpeg); 
} 

發生這種情況時它本質上調整圖像大小(從而扭曲它),而不是種植它。

如果我在cropper.DrawImage調用中切換totalAreacropArea,則它會從底部開始裁剪,但它將圖像循環兩次(但仍是正確的大小)。

我完全困惑於如何正確地做到這一點。


編輯:以下是我嘗試過的一些事例。有什麼我沒有得到,我只是不知道是什麼。

使用奧利弗代碼:

  var targetArea = new Rectangle(new Point(0, 0), new Size(desiredWidth, desiredHeight)); 
      var cropArea = new Rectangle(new Point(0, cropHeightOffset), new Size(desiredWidth, desiredHeight)); 

      ... 

      // Draw it 
      cropper.DrawImage(bmp, targetArea, cropArea, GraphicsUnit.Pixel); 

給我http://dl.dropbox.com/u/6753359/crop/7278482-2.jpeg

  var targetArea = new Rectangle(new Point(0, 0), new Size(desiredWidth, desiredHeight)); 
      var cropArea = new Rectangle(new Point(0, cropHeightOffset), new Size(original.Width, original.Height)); 
      ...... 

      // Draw it 
      cropper.DrawImage(bmp, cropArea, targetArea, GraphicsUnit.Pixel); 

給我http://dl.dropbox.com/u/6753359/crop/7278482-1.jpeg

原始圖像是:http://dl.dropbox.com/u/6753359/crop/7278482%20orig.jpeg

+0

我可能是錯的,但是從MSDN文檔,我認爲'DrawImage'第二個參數應在*目的地*位圖的區域,所以它應該有裁剪區域的高度和寬度。 – 2012-01-11 21:38:30

+0

這不是我在上面的代碼中告訴它的嗎? – KallDrexx 2012-01-11 21:41:18

+0

不;您將原始區域作爲第二個參數,將目標區域作爲第三個參數。 – 2012-01-11 21:49:12

回答

2

您必須指定目標區域,不是總面積:

var newSize = new Size(desiredWidth, desiredHeight); 
var targetArea = new Rectangle(new Point(0, 0), newSize); 
var cropArea = new Rectangle(new Point(0, cropHeightOffset), newSize); 
... 
cropper.DrawImage(bmp, targetArea, cropArea, GraphicsUnit.Pixel); 
+0

這隻有當我有了0,0偏移的croparea時才起作用。當我添加'cropHeightOffset'時,圖像會循環。在這兩個領域使用cropHeighOffset也不起作用,這只是導致圖像調整大小 – KallDrexx 2012-01-11 21:45:04

+0

我更新了問題與我的代碼 – KallDrexx 2012-01-11 21:59:45

+0

Nevermind的例子,這個工程。我減法失敗,並且我的偏移量是向後計算的(應該是原始的 - 希望的) – KallDrexx 2012-01-11 22:15:18