Как к “умному изменяют размер” отображенного изображения к исходному соотношению сторон

У меня есть приложение, в котором конечные пользователи могут измерить и изображения положения в разработчике. Так как спецификация призывает, чтобы изображение было "расширено" к содержанию управления, конечный пользователь может закончиться с неловко расширенным изображением.

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

Быстрый способ решить это состоит в том, чтобы на самом деле предоставить две возможности: 1) масштаб от ширины 2) масштабируется от высоты. Пользователь выбирает метод, и алгоритм корректирует размер изображения при помощи исходного соотношения сторон. Например: изображение отображено как 200x200 на разработчике, но исходное изображение составляет 1024x768 пикселей. Пользователь выбирает "Smart Size from width", и новый размер становится ~200x150, так как исходное соотношение сторон ~1.333

Это в порядке, но как я мог сделать алгоритм более умным и не побеспокоить пользователя путем выяснения, которые определяют размеры перерасчета, должен быть на основе?

11
задан Paul Sasik 9 June 2010 в 18:35
поделиться

4 ответа

Если я правильно интерпретирую вашу спецификацию, вам нужен результат не больше, чем тот, который изначально указал конечный пользователь; вы хотите, чтобы одно из двух измерений уменьшилось, а другое осталось прежним. Другими словами, новый размер должен заполнить пространство дизайнера в одном направлении и укорачивать размер в другом направлении, чтобы сохранить исходное соотношение сторон.

original_ratio = original_width / original_height
designer_ratio = designer_width / designer_height
if original_ratio > designer_ratio
    designer_height = designer_width / original_ratio
else
    designer_width = designer_height * original_ratio

Часто вы будете работать с целочисленными координатами, но деления для получения указанных выше соотношений должны быть с плавающей запятой. Вот перестановка формулы, чтобы она была более дружественной к целым числам. Убедитесь, что ваши целые числа имеют диапазон для обработки максимальной ширины * высоты.

if original_width * designer_height > designer_width * original_height
    designer_height = (designer_width * original_height) / original_width
else
    designer_width = (designer_height * original_width) / original_height
27
ответ дан 3 December 2019 в 01:13
поделиться

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

Также можно рассчитать соотношение сторон "ограничивающей рамки" и сравнить его с соотношением сторон исходного изображения. В зависимости от того, какое соотношение сторон больше, необходимо изменить высоту или ширину.

Можно также ограничить процесс изменения размера так, чтобы во всех случаях выполнялось "масштабирование по ширине". Тогда, чтобы изменить размер изображения, пользователю всегда придется менять его ширину. Высота всегда будет подстраиваться автоматически.

1
ответ дан 3 December 2019 в 01:13
поделиться

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

0
ответ дан 3 December 2019 в 01:13
поделиться

Поскольку вы хотите максимально увеличить масштаб изображения (оригинала) в вашем окне, т.е. область в вашем дизайнере, вы должны взять большую из ширины или высоты оригинального изображения и масштабировать ее до 200. Псевдокод (ширина, высота - размеры оригинала):

if (width > height) {
    scaledWidth = 200;
    scaledHeight = (height * 200) / width;
} else {
    scaledHeight = 200;
    scaledWidth = (width * 200) / height;
}
1
ответ дан 3 December 2019 в 01:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: