Наилучшая логика изменения размера и / или обрезки - PullRequest
6 голосов
/ 26 октября 2009

Я сталкивался с этим несколько раз и думал, что было бы хорошо выпустить это там. Какое ваше лучшее изображение изменить размер и / или обрезать логику. Идея состоит в том, что какой-то метод вызывается с целевым изображением, размерами и флагом обрезки - это вернет или сохранит, или что угодно, нужное изображение.

Шахта ниже. Преобразован из VB в C #, так что да, будут небольшие ошибки, но мы смотрим на логику.

// INIT
// On/off
bool WeAreCropping = true;

// Get some dimensions
int TargetWidth = RequestedWidth;
int TargetHeight = RequestedHeight;
int SourceWidth = SourceImage.Width;
int SourceHeight = SourceImage.Height;
int ResizeWidth = TargetWidth;
int ResizeHeight = TargetHeight;

// GET RESIZE VALUES
// Are we cropping?
if (WeAreCropping) {

    // Get source and target aspect ratio
    double SourceAspectRatio = SourceWidth / SourceHeight;
    double TargetAspectRatio = TargetWidth / TargetHeight;

    // Compare aspect ratios to find out if we should we resize by 
    // width or height or nothing
    if (TargetAspectRatio < SourceAspectRatio) {
        ResizeWidth = TargetHeight / SourceHeight * SourceWidth;
    }
    else if (TargetAspectRatio > SourceAspectRatio) {
        ResizeHeight = TargetWidth / SourceWidth * SourceHeight;
    }
    else {
      // Same aspect ratio
    }


}
else {

    // If the target image is bigger than the source
    if (TargetWidth > SourceWidth && TargetHeight > SourceHeight) {
        TargetWidth = SourceWidth;
        TargetHeight = SourceHeight;
    }

    double Ratio = 0;

    // What ratio should we resize it by
    if (SourceWidth / TargetWidth > SourceHeight / TargetHeight) {
        Ratio = SourceWidth / TargetWidth;
    }
    else {
        Ratio = SourceHeight / TargetHeight;
    }

    ResizeWidth = Math.Ceiling(SourceWidth / Ratio);

    ResizeHeight = Math.Ceiling(SourceHeight / Ratio);
}

// TIME TO DO SUMFINK
// Resize the image using ResizeWidth and ResizeHeight
// Do it

if (WeAreCropping) {
    // Crop the resized image at the center TargetWidth and TargetHeight
    // Do it
}

Я подозреваю, что это может быть намного элегантнее, так что, возможно, вы могли бы сделать лучше.

Ответы [ 2 ]

4 голосов
/ 30 октября 2009

Я бы сказал, что вы должны использовать стандартные типы геометрии, такие как Rectangle и Size. Тогда вам, вероятно, следует также поддерживать вариант использования, когда вызывающий объект хочет разместить изображение в каком-то большем прямоугольнике, но все же хочет сохранить соотношение размеров исходного изображения.

Один из способов изменения размера вы можете найти здесь .

0 голосов
/ 22 июня 2010

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

...