Каков наиболее простой подход к реализации фильтра сжижения, подобного тому, который есть у фотошопа в Java?
Каков наиболее простой подход к реализации фильтра сжижения, подобного тому, который есть у фотошопа в Java?
2 ответа
По сути, у вас есть исходное изображение и сетка. Сетка начинается как сетка с идеальными квадратами, но деформируется. Алгоритм
For Each section of the mesh
For Each pixel of the section
(x, y) = Location in original photo for this pixel // (floating point)
color = ColorFromOriginal(x, y) // this needs to blend neighboring pixels if fractional
setColor(color)
Выяснение (x, y) - простая геометрия - сопоставьте центр деформированного квадрата с центром оригинала, затем выясните, в каком треугольнике вы находитесь (N, S, E, W) и сопоставьте деформированный треугольник с оригинал.
+---------+
|\ /|
| \ N / |
| \ / |
| \ / |
| W X E |
| / \ |
| / \ |
| / S \ |
|/ \|
+---------+
Когда у вас есть (x, y) в плавающей точке, рассчитайте его цвет, смешав четыре пикселя, которые перекрывают эту плавающую точку. координата в соотношении перекрытия.
Целые пиксели
+----+----+----+
| | | |
| | | |
+----+----+----+
| | | |
| | | |
+----+----+----+
| | | |
| | | |
+----+----+----+
Плавающая часть наложенный на него пиксель
+----+----+----+
| | | |
| x|xx | |
+----+----+----+
| x|xx | |
| | | |
+----+----+----+
| | | |
| | | |
+----+----+----+
Результирующий цвет представляет собой смешение четырех пикселей в соотношении с тем, насколько он перекрывается.
Это точно алгоритм изменения размера (повторной выборки). Сетка не деформируется, а просто увеличивается, поэтому шаг треугольника не нужен, но это та же идея.
То, что вы ищете, это в основном фильтр деформации, вы можете проверить: http://www.jhlabs.com/ip/filters/ и я думаю, что вы ищете, http://www.jhlabs.com/ip/filters/WarpFilter.html
надеюсь, это поможет