Эффект Ленза

Я создал эффект линзы, чтобы создать восприятную функцию для раздела "About" приложения шифрования файла

Описание

Библиотека позволяет применять эффект линзы к Java Swing JPanel

Для версии v1.2 я создал демо-приложение, показывающее линзу на JFrame, которая может быть перетащена по всему экрану.

Описание кода

Эффект рассеивателя создается с помощью преобразования полярных координат, когда угол остается таким же, и радиус удлиняется вблизи центра при сжатии к краям. Радиус остается неизменным в центре и краях.

Затем применяется гауссийский сглаживающий фильтр размером 3x3

Окна

Эффект Lens v1.1 (2015 год)

Загрузка

Эффект Lens v1.2 (2018 год)

Загрузка

Эффект Lens v1.3 (2019 год)

Смотреть видео
Загрузка

Версия

image

Небольшой эффект прикладных линз был побочным продуктом весенних каникул без каких-либо планов.

В то время я заканчивал программирование первой версии энкодера File Encoder Application, и мне нужно было что-то заманчивое для The Augh...

Изначальная идея не моя, но я реализовала ее, основываясь на эффекте, который я видела в одной из этих культовых демозах DOS.

Я решил инкорпорировать эффект в Java Swing JPanel для моего проекта.

Всё внутри панели может быть увеличено с помощью увеличительного стекла, расположенного в выбранных координатах.

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

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

Когда у вас есть радиус и выясняется, будет ли увеличительное стекло расширять или уменьшать содержание, создается двухмерная квадратная матрица с одним элементом для каждого квадратного пикселя, содержащего увеличительное стекло.
Алгоритм вычисляет координаты соответствующего исходного пикселя в оригинальном снимке для каждого пикселя назначения, чтобы определить цвет при применении преобразования.
Преобразование предполагает простое преобразование полярных координат, поэтому используется увеличительная линза:
Пиксель рассчитывается по конкретному положению рамы рассеивателя и используется для определения цвета при применении преобразования.Пиксель также будет находиться в раме объективов.Кроме того, рассчитывается радиус от центра рассеивателя до угла для данного пикселя.Пиксель "происхождения" для пикселя, который мы вычисляем, будет под одним углом, но радиус изменится.Радиус составляет от 0% до 100% как для цели, так и для пикселей, при этом 100% соответствует длине радиуса рассеивателя.Источник пиксела рассчитывается для каждого целевого пикселя, сохраняя свой угол и преобразуя радиус с помощью функции с монотонно возрастающей производной. Это преобразование происходит в интервале от 0 до 1, где f(0) равняется 0 и f(1) равно 1. Здесь 0 представляет 0% радиуса рассеивателя, а 1 представляет 100% радиуса рассеивателя.Это означает, что радии отберут источник пикселя из меньшего радиуса, что расширит круг объективов.За пределами круга линзы преобразование будет представлять собой идентичность, что означает, что исходный пиксель не изменится.


Объяснение немного сбивает с толку, но если вам интересно больше узнать об этой теме, не стесняйтесь связаться со мной.

Я надеюсь, что кто-то найдёт это полезным :-).

image

Новая версия приложения содержит круглое графическое окно со подвижными линзами, которые могут контролироваться щелчком и тасканием с вашей мышкой.
Вы можете выйти из приложения, нажав ЭКУ.

Налицо несколько проблем:

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

Новая версия приложения касается ошибки прозрачности, которая произошла в операционных системах Mac и Linux.

В последнем варианте также рассматривается вопрос о пикселации, обнаруженный в предыдущих вариантах.

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

Последняя имеющаяся подделка этой версии работает как с Java-8, так и с Java-11.

Видеоматериалы

Загрузка