Как мне найти размер с соотношением сторон 4: 3, который соответствует заранее определенному размеру?

Проблема здесь в том, что у меня есть окно отображения размером x на y, и мне нужно отображать изображение внутри окна без какой-либо прокрутки и поддерживать соотношение сторон 4: 3. У меня есть следующий фрагмент кода:

// Lock the current height, calculate new width of the canvas and scale the viewport.
// get width of the movie canvas
qreal width = canvas_->width();

// Find the height of the video
qreal height = (width/4.0) * 3;

// find original width and height for video to calculate scaling factor
qreal videoWidth = movieData_->GetWidth();
qreal videoHeight = movieData_->GetHeight();

// calculate scaling factor
qreal scaleFactorWidth = width/videoWidth;
qreal scaleFactorHeight = height/videoHeight;

Конечно, используя высоту или ширину в качестве «привязки», новое изображение так или иначе вызовет прокрутку (при условии, что исходное изображение больше, чем окно). Как мне найти размер с соотношением сторон 4: 3, который соответствует заранее определенному размеру?

Изменить. Мне нужно было бы передать коэффициент масштабирования как для x, так и для y, чтобы выполнить масштабирование.

canvas_->scale(scaleFactorWidth, scaleFactorHeight);

person Extrakun    schedule 02.09.2009    source источник


Ответы (4)


    struct dimensions resize_to_fit_in(struct dimensions a, struct dimensions b) {
        double wf, hf, f;
        struct dimensions out;

        wf = (double) b.w / a.w;
        hf = (double) b.h / a.h;

        if (wf > hf)
                f = hf;
        else
                f = wf;

        out.w = a.w * f;
        out.h = a.h * f;

        return out;
}

Вот версия C, где возвращаемое измерение будет размером «a», подходящим для размера «b» без потери соотношения сторон.

person jpastuszek    schedule 02.09.2009

Просто возьмите минимум из обоих рассчитанных значений:

scale = min(scaleFactorWidth, scaleFactorHeight)

или (если вы хотите внешнюю посадку)

scale = max(scaleFactorWidth, scaleFactorHeight)
person Marcel Jackwerth    schedule 02.09.2009
comment
Я не уверен, что понимаю; Мне нужен масштабный коэффициент для x и y. - person Extrakun; 02.09.2009
comment
@Extrakun, коэффициент масштабирования будет одинаковым для обоих, иначе вы получите непропорциональное изображение. - person Dominic Rodger; 02.09.2009
comment
Справа: scale_x = scale_y = scale. Это единственный способ сохранить соотношение сторон. - person Marcel Jackwerth; 02.09.2009

Найдите наибольшее из двух значений ширины w и высоты h. Допустим, ваша максимальная ширина x высота составляет 100 x 80. Учтите, что 100/80 = 1,25.

Случай 1. Если w/h > 1.25, разделите w на 100, чтобы получить отношение вашего исходного размера к новому размеру. Затем умножьте h на это соотношение.

Случай 2: В противном случае разделите h на 80, чтобы получить отношение вашего исходного размера к новому размеру. Затем умножьте w на это соотношение.

person Dominic Rodger    schedule 02.09.2009
comment
Нет, это не квадрат. Думаю, я мог просто продолжать уменьшать ширину, которую хочу, пока не получу высоту, которая соответствует предопределенному размеру? - person Extrakun; 02.09.2009

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

    private static function resizeTo(dispObj:DisplayObject, width:Number, height:Number) : void
    {
        var ar:Number = width / height;
        var dispObjAr:Number = dispObj.width/dispObj.height;
        if (ar < dispObjAr)
        {
            dispObj.width = width;
            dispObj.height = width / dispObjAr;
        }
        else
        {
            dispObj.height = height;
            dispObj.width = height * dispObjAr;
        }
        return;
    }

РЕДАКТИРОВАТЬ: чтобы поддерживать 4: 3, исходные изображения должны быть 4: 3

person spender    schedule 02.09.2009