我試圖通過從中間裁剪來將肖像圖像裁剪成特定的景觀尺寸,而我似乎在做錯事。現在,我有以下代碼:我的裁剪邏輯有什麼問題?
// 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
調用中切換totalArea
和cropArea
,則它會從底部開始裁剪,但它將圖像循環兩次(但仍是正確的大小)。
我完全困惑於如何正確地做到這一點。
編輯:以下是我嘗試過的一些事例。有什麼我沒有得到,我只是不知道是什麼。
使用奧利弗代碼:
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
我可能是錯的,但是從MSDN文檔,我認爲'DrawImage'第二個參數應在*目的地*位圖的區域,所以它應該有裁剪區域的高度和寬度。 – 2012-01-11 21:38:30
這不是我在上面的代碼中告訴它的嗎? – KallDrexx 2012-01-11 21:41:18
不;您將原始區域作爲第二個參數,將目標區域作爲第三個參數。 – 2012-01-11 21:49:12