Что не так с моей логикой обрезки? - PullRequest
1 голос
/ 12 января 2012

Я пытаюсь обрезать портретное изображение до определенного размера ландшафта, обрезая его из середины, и я, кажется, делаю что-то не так.Прямо сейчас у меня есть следующий код:

// 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);
}

Когда это происходит, оно существенно изменяет размер изображения (таким образом искажая его) вместо того, чтобы обрезать его.

Если я переключу totalArea и cropArea в моем вызове cropper.DrawImage, то он обрезается снизу, но изображение повторяется дважды (но все равно правильный размер).

Я совершенно не понимаю, как это сделать правильно.


Редактировать: Вот несколько примеров того, что я пробовал.Есть кое-что, чего я не получаю, я просто не уверен, что.

Используя код Оливера:

            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

1 Ответ

2 голосов
/ 12 января 2012

Вы должны указать целевую область, а не общую площадь:

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); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...