Интерполяция Для решения вышеозначенной проблемы применяется интерполяция. Интерполяция это процесс нахождения значений функции (в нашем случае - цвета пиксела) в произвольном месте пространства, по известным значениям функции в некоторых опорных точках. Мы бы могли преобразовать исходные пикселы, а потом интерполировать значения цвета в «дырках» то есть в местах, где пикселов нет, и таким образом сформировать непрерывный растр. Это хорошая идея. Но вот незадача большинство методов интерполяции основано на регулярной сетке. То есть опорные точки должны следовать друг за другом с фиксированным шагом. А у нас-то проблема как раз в том, что опорные пикселы, в общем случае, разбросаны как попало. В п
Сразу предупрежу, что я разрабатывал этот компонент просто так, ради интереса, а не для конкретного применения. И предвосхищая вопросы типа «а почему вы не воспользовались технологией/компонентом XXX?», сразу скажу не воспользовался потому, что мне было интересно это сделать самому, и именно под GDI+. Хотя я имею небольшой опыт и под DirectX/XNA и под WPF, и знаю, что там это сделать легче, но повторюсь мне не интересно использовать то, что кто- то уже написал до меня. Кроме того, мне хотелось бы немного рассеять миф про низкую производительность GDI+. Как и следовало ожидать, в большей степени производительность зависит от применяемых алгоритмов, а не от платформы. Я уже писал про нелинейные преобразования в GDI+, но прошлая статья касалась только векторной графики. Там преобразования довольно тривиальны и сводятся к пересчету координат вершин в пространстве. Для растровых изображений все не так просто. Зачем это нужно А зачем собственно нужны нелинейные преобразования? Вариантов применения как минимум два: Первый устранение оптических искажений фотографий. Спектр применения широк от любительской фотографии, до геодезии и обработки спутниковых изображений земли. Второй как ни парадоксально, внесение оптических искажений. Зачем? Ну например, для создания «эффекта присутствия», для визуального оформления, в играх, да и просто для развлечения :) Проблематика Сначала проясним для себя, что собственно такое преобразования растровых изображений? Линейные (аффинные) преобразования это такие преобразования, которые описываются формулой: x =Mx+c Где x - преобразованные координаты, x исходные координаты, M некоторая фиксированная матрица, c некоторая константа. К аффинным преобразованиям относится сдвиг, масштабирование и поворот. Все эти типы преобразований уже поддерживаются объектом Graphics, поэтому их реализация не вызывает сложностей. Сложности вызывают нелинейные преобразования. Они имеют вид, аналогичный приведенной формуле, но только вот матрица М становится зависимой от x. К таким преобразованиям относится перспектива, проекция, отображение плоскости на сферу, эффект линзы, и многие другие. Если не вдаваться в математику, то на пальцах можно сказать что нелинейные преобразования это сжатие или растяжение частей изображения. Причем коэффициент сжатия или растяжения разный в разных частях изображения. Поддержки нелинейных преобразований нет в стандартной библиотеке .Net. Но если чего-то нет, а очень хочется, то приходится это писать самому, чем мы собственно и займемся. Решение в лоб В принципе, математическое решение проблемы тривиально. Изображение это набор пикселов, которые имеют свои координаты. Просто подставив координаты пиксела в формулу преобразования получаем новые координаты пикселов, из которых собственно и сложится изображение. А теории легко. Но вот на практике такой способ не подходит. Почему? Очень просто растр это не просто набор пикселов, это непрерывный и регулярный набор пикселов. Если мы просто преобразуем координаты пикселов, то окажется что в какой-то точке результирующего изображения пикселов станет больше, в какой-то меньше, а в каких-то местах и вообще образуются дыры. В то время как нам необходимо на выходе получить растр, имеющий непрерывную и регулярную сетку из пикселов.
Введение В этой статье я буду в основном описывать построение высокопроизводительного графического приложения под GDI+. Но в конце статьи будет ссылка на вполне себе рабочий компонент. Так что, тех, кого интересует конечный результат, могут не читать последующие пару глав, а перейти к просмотру картинок и скачиванию исходника .
Нелинейные преобразования растровых изображений в GDI+
Нелинейные преобразования растровых изображений в GDI+
Нелинейные преобразования растровых изображений в GDI+ / GotDotNet.Ru
Комментариев нет:
Отправить комментарий