La llibreria permet aplicar l'efecte lent a un JPanel de Java Swing
A la versión v1.2 es va crear una aplicació de demostració que pinta una lent a un JFrame que es pot arrossegar per tota la pantalla
L'efecte lent va nèixer com a una necessitat de programar un efecte vistós per al About ... de l'aplicació d'encriptació d'arxius
La llibreria permet aplicar l'efecte lent a un JPanel de Java Swing
A la versión v1.2 es va crear una aplicació de demostració que pinta una lent a un JFrame que es pot arrossegar per tota la pantalla
Aquest efecte lent s'aconsegueix aplicant una transformació en coordinades polars, en la que l'angle roman invariant, i el radi s'estira a prop del centre, i es contrau a prop de les vores, sent invariant al centre y a sobre de les vores
Desprès, s'aplica un filtre Gaussià de suavització de mida 3x3
La petita aplicació efecte lent va aparèixer com a resultat t'una Setmana Santa sense plans.
Per aquelles dates jo estava acabant de programar la primera versió de l'encriptador (File Encoder Application), i necessitava alguna cosa vistosa per a l'opció "Sobre l'aplicació ..."
La idea original no és meva, si no que la vaig implementar seguint un efecte que havia vist en una d'aquelles legendàries demos de DOS.
La forma d'implementació escollida va ser encapsular l'efecte dins d'un JPanel de Java swing.
Tot el que es fiqui dins del panel, pot ser "ampliat" amb la lent, que pot ser posada a les coordenades que s'escullin.
Va ser especialment costós aconseguir que els refrescos dels components de text (en concret quan es modifica la ubicació del text seleccionat), no afectés negativament a l'efecte visual.
Internament, la manera de funcionar és que quan es crea el LensJPanel, se li passa el JPanel que té el contingut al que es vol fer l'efecte, el radi de la lent i si serà una lent d'ampliació o de disminució.
Com tenim el radi i si la lent serà d'ampliació o de disminució, es crea una matriu quadrada de dues dimensions, amb un element per cada pixel del quadrat que conté la lent.
Per a cada un d'aquestos píxels (píxel destí), es calculen las coordenades de la imatge original (píxel origen) d'on s'haurà d'agafar el color per quan es faci la transformació.
La transformació és senzilla, això sí, en coordinades polars. Ara explicaré aquesta transformació pel cas de lent d'ampliació:
Per a una posició determinada del quadre de la lent, es calcula un píxel del que es recollirà el color quan s'hagi de fer la transformació. Aquest píxel, estarà també dins del quadre de la lent. A més, per a un píxel determinat, es calcula el radi (desde el centre de la lent) i l'angle.El píxel "origen" pel píxel que estem calculant tindrà aquest mateix angle, però canviarà el radi. El radi sempre varia del 0% al 100%, tant pels píxels "origen" com pels píxels "destí", on el 100% és la longitud del radi de la lent. És a dir, per a cada píxel destí, per a calcular el seu píxel origen, es manté l'angle i el radi es transforma, utilitzant una función amb derivada monòtona creixent en l'interval entre 0 i 1, on f(0) tindrà un valor de 0 i f(1) tindrà un valor de 1, on 0 es el 0% del radi de la lent i 1 es el 100% del radi de la lent. Això voldrà dir que els radis prendran el seu píxel origen d'un radi menor, cosa que farà l'efecte de que a prop del dentre de la lent s'amplia la imatge. Fora del cercle de la lent, la transformaciò serà la identitat (és a dir, els píxels destí en aquesta zona, seran iguals que els píxels origen).
L'explicació ha quedat una mica confusa, però si t'interessa el tema, te pots posar en contacte amb mí.
Espero que a algú li sigui d'utilitat :-)
La nova versió de l'aplicació obre una finestra gràfica circular amb la lent que es pot moure fent click amb el ratolí i arrossegant.
Es poden veure un parell de problemes:
La nova versió de l'aplicació corregeix un error de transparència que es produïa a entorns Mac i Linux.
També millora el problema del pixel.lat que hi havia a les versions anteriors.
Això s'aconsegueix passant a la imatge de la lent un filtre de suavitzat gaussià que fa un efect de difuminat i disminueix l'efecte de pixel.lació de l'ampliació.
La última subversió disponible d'aquesta versió, funciona tant amb Java-8 com amb Java-11.