La bibliothèque permet l'application d'un effet de lentille à un Java Swing JPanel
Pour la version v1.2, j'ai créé une application de démonstration qui affiche l'objectif sur un JFrame, qui peut être glissé sur tout l'écran
J'ai créé l'effet de lentille pour fournir une fonctionnalité engageante pour la section "À propos" de l'application de cryptage de fichiers
La bibliothèque permet l'application d'un effet de lentille à un Java Swing JPanel
Pour la version v1.2, j'ai créé une application de démonstration qui affiche l'objectif sur un JFrame, qui peut être glissé sur tout l'écran
L'effet de lentille est créé en utilisant une transformation de coordonnées polaires, où l'angle reste le même, et le rayon est allongé près du centre tout en étant comprimé vers les bords. Le rayon reste inchangé au centre et les bords
Un filtre de lissage gaussien d'une taille de 3x3 est ensuite appliqué
L'effet de petite lentille d'application était le sous-produit d'une pause printanière sans plan.
À ce moment-là, je finissais la programmation de la première version de l'encodeur (File Encoder Application), et j'avais besoin de quelque chose d'accrocheur pour le About...
L'idée originale n'est pas la mienne, mais je l'ai implémentée sur la base d'un effet que j'avais vu dans l'une de ces démos emblématiques de DOS.
J'ai décidé d'encapsuler l'effet dans un Java Swing JPanel pour mon projet.
Tout dans le panneau peut être agrandi à l'aide d'une loupe positionnée à vos coordonnées choisies.
Il était particulièrement difficile de s'assurer que le rafraîchissement des composants du texte, en particulier lors de la modification de l'emplacement du texte sélectionné, n'affectait pas l'apparence visuelle.
Lorsque vous créez le LensJPanel, le contenu du JPanel est appliqué à l'élément qui subira l'effet de grossissement. Vous pouvez spécifier le rayon de la loupe et si elle agrandira ou diminuera le contenu.
Lorsque vous avez le rayon et déterminez si la loupe agrandira ou rétrécira le contenu, une matrice carrée bidimensionnelle est créée avec un élément pour chaque pixel carré contenant la loupe.
L'algorithme calcule les coordonnées du pixel source correspondant dans l'image d'origine pour chaque pixel de destination afin de déterminer la couleur lors de l'application de la transformation.
La transformation implique une simple transformation des coordonnées polaires, c'est pourquoi une loupe est utilisée:
Un pixel est calculé à partir d'une position spécifique de la monture de la lentille et est utilisé pour déterminer la couleur lorsque la transformation est appliquée.Le pixel sera également dans le cadre de l'objectif.De plus, on calcule le rayon du centre de la lentille à l'angle pour un pixel donné.Le pixel "origine" pour le pixel que nous calculons sera au même angle, mais le rayon changera.Le rayon s'étend de 0% à 100% pour les pixels «cible» et «source», avec 100% représentant la longueur du rayon de la lentille.Le pixel source est calculé pour chaque pixel cible en maintenant son angle et en transformant le rayon à l'aide d'une fonction à dérivée croissante monotonement. Cette transformation se produit dans l'intervalle compris entre 0 et 1, où f(0) est égal à 0 et f(1) est égal à 1. Ici, 0 représente 0 % du rayon de la lentille, et 1 représente 100 % du rayon de la lentille.Cela signifie que les rayons prendront leur pixel source à partir d'un rayon plus petit, ce qui élargira le cercle de l'objectif.En dehors du cercle de la lentille, la transformation sera l'identité, ce qui signifie que le pixel source ne changera pas.
L'explication est un peu confuse, mais si vous êtes intéressé à en apprendre davantage sur le sujet, n'hésitez pas à me contacter.
J'espère que quelqu'un trouvera ça utile :-)
La nouvelle version de l'application dispose d'une fenêtre graphique circulaire avec un objectif mobile qui peut être contrôlé en cliquant et en faisant glisser avec votre souris.
Vous pouvez quitter l'application en appuyant sur ESC.
Quelques problèmes sont évidents :
La nouvelle version de l'application corrige un bug de transparence qui s'est produit sur les systèmes d'exploitation Mac et Linux.
La dernière version résout également le problème de pixellisation trouvé dans les versions précédentes.
Ceci est accompli en appliquant un filtre de lissage gaussien à l'image de l'objectif, créant un effet de flou qui réduit la pixelisation causée par le grossissement.
La dernière version disponible de cette version fonctionne à la fois avec Java-8 et Java-11.