Подтвердить что ты не робот

Математика/алгоритм Fit изображение на экран сохранить соотношение сторон

Мне нужна помощь с математикой/алгоритмом, чтобы сделать изображение с известным размером и соответствовать одному из двух размеров экрана:

720 x 480 или 1280 x 1024.

Размеры изображения поступают из файла XML, однако эти размеры являются веб-размерами, я также получаю выбор изображений из XML, который может иметь более высокое и более низкое разрешение, чем размеры веб-страниц.

Я хочу использовать аспектное соотношение размеров веб-страниц для отображения изображения с более высоким разрешением, если оно доступно, на экране HD (1280x720) или, если пользователь находится на экране SD (720x480), отображает изображение на этом экране.

Другие вещи, которые были бы полезны для этого, но более низкий приоритет, были бы, если бы я знал, что разрешение изображения меньше в обоих измерениях, чем экран SD (в этом случае все, что я знаю, является веб-измерением и горизонтальный размер файла изображения), чтобы отобразить его как фактический размер на этом экране.

Надеюсь, что это достаточно ясно.

Спасибо!

4b9b3361

Ответ 1

Общий, как может быть:

Данные изображения: (w i, h i) и определите r i= w i/h <суб > ясуб >
Разрешение экрана: (w s, h s) и определите r s= w s/h sсуб >

Масштабируемые размеры изображения:

rs > ri ? (wi * hs/hi, hs) : (ws, hi * ws/wi)

Итак, например:

         20
|------------------|
    10
|---------|

--------------------     ---   ---
|         |        |      | 7   |
|         |        |      |     | 10
|----------        |     ---    |
|                  |            |
--------------------           ---

ws = 20
hs = 10
wi = 10
hi = 7

20/10 > 10/7 ==> (wi * hs/hi, hs) = (10 * 10/7, 10) = (100/7, 10) ~ (14.3, 10)

Который, как вы можете видеть, четко масштабируется по размеру экрана, потому что высота равна высоте экрана, но явно сохраняет соотношение сторон, так как 14.3/10 ~ 10/7

UPDATE

Центрируйте изображение следующим образом:

вызывать (w new, h new) новые измерения.

top = (hs - hnew)/2
left = (ws - wnew)/2

Ответ 2

Здесь он находится в прямом C.

Вы хотите масштабировать обе координаты по возвращенному коэффициенту масштабирования.

/* For a rectangle inside a screen, get the scale factor that permits the rectangle
   to be scaled without stretching or squashing. */
float 
aspect_correct_scale_for_rect(const float screen[2], const float rect[2])
{
    float screenAspect = screen[0] / screen[1];
    float rectAspect = rect[0] / rect[1];

    float scaleFactor;
    if (screenAspect > rectAspect)
        scaleFactor = screen[1] / rect[1];
    else
        scaleFactor = screen[0] / rect[0];

    return scaleFactor;
}

Ответ 3

Коррекция формата изображения с буквенно-цифровым интерфейсом или с привязкой к экрану

Недавно я написал метод для обработки этой точной проблемы в iOS. Я использую библиотеку матриц Eigen для масштабирования, но принцип (коэффициент масштабирования) одинаковый без матриц.

Eigen::Matrix4x4f aspectRatioCorrection(bool fillScreen, const Eigen::Vector2f &screenSize, const Eigen::Vector2f &imageSize)
{
    Eigen::Matrix4x4f scalingMatrix(Eigen::Matrix4x4f::Identity());

    float screenWidth = screenSize.x();
    float screenHeight = screenSize.y();
    float screenAspectRatio = screenWidth / screenHeight;
    float imageWidth = imageSize.x();
    float imageHeight = imageSize.y();
    float imageAspectRatio = imageWidth / imageHeight;

    float scalingFactor;
    if (fillScreen) {
        if (screenAspectRatio > imageAspectRatio) {
            scalingFactor = screenWidth / imageWidth;
        } else {
            scalingFactor = screenHeight / imageHeight;
        }
    } else {
        if (screenAspectRatio > imageAspectRatio) {
            scalingFactor =  screenHeight / imageHeight;
        } else {
            scalingFactor = screenWidth / imageWidth;
        }
    }

    scalingMatrix(0, 0) = scalingFactor;
    scalingMatrix(1, 1) = scalingFactor;

    return scalingMatrix;
}