Логика FILL изображения, такая как "Stretch.Uniform" из WPF - PullRequest
2 голосов
/ 10 мая 2019

Я ищу логику Image FILL для применения в моем консольном приложении, которое генерирует файл TIFF. У меня размер контейнера изображения как 1200 *1800* 1002 * пиксель.

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

Если у меня размер изображения как 1200 *1600* 1008 *, то я получаю пустое пространство внизу, и если я пытаюсь разместить изображение в контейнере, то оно растягивается, и изображение выглядит не очень хорошо. Изображение выше 1200 *1600* 1010 * подходит хорошо.

Я ищу логику, аналогичную " Stretch.Uniform " приложения WPF, которая заполняет изображение равномерно, не теряя фактический вид изображения.

private static Dimension getScaledDimension(Dimension imgSize, Dimension boundary)
{

    int original_width = imgSize.width;
    int original_height = imgSize.height;
    int bound_width = boundary.width;
    int bound_height = boundary.height;
    int new_width = original_width;
    int new_height = original_height;

    // first check if we need to scale width. 
    if (original_width > bound_width)  
    {
        //scale width to fit
        new_width = bound_width;
        //scale height to maintain aspect ratio
        new_height = (new_width * original_height) / original_width;
    }


    // then check if we need to scale even with the new height. 
    if (new_height > bound_height)
    {
        //scale height to fit instead
        new_height = bound_height;
        //scale width to maintain aspect ratio
        new_width = (new_height * original_width) / original_height;
    }

    return new Dimension { height = new_height, width = new_width };
}

1 Ответ

2 голосов
/ 13 мая 2019

Principle image

Проверьте соотношение сторон 2 прямоугольников, чтобы решить, какое свойство подходит.

private static Dimension getScaledDimension(Dimension imgSize, Dimension boundary)
{
    int original_width = imgSize.width;
    int original_height = imgSize.height;
    int bound_width = boundary.width;
    int bound_height = boundary.height;

    double original_aspect = (double)original_width / original_height;
    double bound_aspect = (double)bound_width / bound_height;

    //original size is wider than boundary, fit boundary width
    if(original_aspect > bound_aspect)
    {
        return new Dimension
        {
            width = boundary.width,
            height = (int)Math.Round(boundary.width / original_aspect)
        };
    }

    //original size is taller than boundary, fit boundary height
    else
    {
        return new Dimension
        {
            height = boundary.height,
            width = (int)Math.Round(boundary.height * original_aspect)
        };
    }
}
...