Я имею в виду без черных полос. 1080 не кратно 768, так что есть какая-то потеря данных?
Я имею в виду без черных полос. 1080 не кратно 768, так что есть какая-то потеря данных?
Ответы:
По сути, изображение представляет собой группу точечных выборок (читай пиксель - это не маленький квадрат 3 ). Когда вы преобразуете или масштабируете изображение, вам нужно его повторно сэмплировать. Итак, теоретически вы берете точечные выборки и превращаете их в непрерывную функцию. Затем вы выбираете эту непрерывную функцию и восстанавливаете сигнал. Итак, здесь есть две или три разные фазы.
Обратите внимание, что ни один из этих шагов не имеет фиксированной формы. На практике при оптимизации невозможно сказать, что есть шаги. Преобразование не обязательно должно быть простым, это может быть отображение формы в спираль и т. Д.
Изображение 1 : 1-D сигнал, восстановленный различными фильтрами.
На практике известно немного о реконструкции сигналов в области обработки сигналов. Разработка этих фильтров и выбор правильных - это отдельная форма искусства. Но, по сути, выбор фильтра - это компромисс между размытием и звонком . Конечно, у алгоритма есть и другие качества, такие как количество инструкций, которое требуется для выполнения, скорость и объем памяти, которые необходимы, и т. Д. Что может быть очень важно для приложений реального времени или встроенных приложений.
Изображение 2 : Обзор всего процесса.
Существует множество алгоритмов увеличения и уменьшения масштаба для масштабирования изображений от любого разрешения до любого другого произвольного разрешения. Каждый алгоритм обычно включает компромисс между эффективностью, плавностью и четкостью, с различной степенью компромисса для разных алгоритмов.
Проверьте эту статью Wikipedia для таких алгоритмов и примеров таких алгоритмов.
Наиболее популярным (и используемым) алгоритмом является алгоритм бикубической интерполяции . Он интерполирует между 2D точками на прямоугольной сетке. Используя кубические сплайны (или кубическую интерполяцию), он сначала интерполирует в одном измерении (находит интерполированную строку / столбец), затем интерполирует интерполированную строку / столбец в другом измерении.
Билинейная интерполяция аналогична бикубической интерполяции, за исключением того, что первая интерполирует с использованием линейной функции и может интерполировать только между двумя значениями, а вторая использует кубическую функцию и может интерполировать между четырьмя значениями.
Простая функция для бикубической интерполяции выглядит следующим образом:
f(f(p00, p01, p02, p03, y),
f(p10, p11, p12, p13, y),
f(p20, p21, p22, p23, y),
f(p30, p31, p32, p33, y),
x)
где (x, y) - интерполированная позиция, а p [] [] - двумерный массив, представляющий сетку 4 * 4.
Проверьте эту ссылку для получения дополнительной информации и примера кода, который действительно очень помогает!
Хотя остальные ответы верны, я не уверен, что они полностью отвечают на ваш вопрос. Чтобы не получить черные полосы, у вас есть 2 варианта, если назначение не совпадает с формой (или соотношением сторон) с источником:
Есть и другой вариант, но он не соответствует вашим критериям - масштабируется равномерно, но только до тех пор, пока 1 измерение не станет таким же большим, как пункт назначения. В этом случае вы бы масштабировали как по горизонтали, так и по вертикали на 1.40625, чтобы получить результат 1440x1080. Обычно это называется «масштабирование по размеру».
Для любой из этих опций вы можете использовать любой алгоритм масштабирования, соответствующий вашим потребностям.