Sei sulla pagina 1di 65

UNIVERSIDAD EL BOSQUE

FACULTAD DE ING. ELECTRNICA


CURSO DE JAVA
PRESENTADO A: JUAN CARLOS DAZ
PRESENTADO POR: JACKSON DAVID NIO Cod. 04!00"!
#ANEJO AVANZADO DE I#$GENES EN JAVA
INTRODUCCION:
El API de manejo avanzado de imgenes extiende la plataforma de Java (incluso el API
de Java 2D) permitiendo una imagen sofisticada alto rendimiento !ue procesa para ser
incorporado en los programas de Java" El manejo avanzado de imagen de java es un
juego de clases !ue proporcionan una funcionalidad de imagen ms all de Java 2D #
de la $undaci%n de Java aun!ue es compati&le con esos API"

El API de java avanzado de imagen lleva a ca&o un juego de imagen del centro !ue
procesa capacidades inclu#endo imagen azulada regiones de inter's (ilando # la
ejecuci%n diferido" JAI tam&i'n ofrece un juego de imagen del centro !ue procesa a
operadores !ue inclu#en a muc(os puntos en com)n rea # operadores del dominio de
la frecuencia"

JAI encapsula los datos de la estructura de la imagen # las invocaciones del m'todo
remoto dentro de los datos de la imagen re*utiliza&les permitiendo un arc(ivo de la
imagen un o&jeto de imagen de red o los datos del real*tiempo !ue vierten para ser
procesados id'nticamente" JAI sigue una carrera de tiempo de la &i&lioteca modelo de
java mientras proporciona la independencia de la plataforma con el paradigma +escri&a
una vez ejecute en cual!uier parte"+ El imaging del cliente*servidor se apo#a por v,a de
la plataforma de Java !ue est conectando a una red de computadoras # tecnolog,as de
ejecuci%n remotas" -a ejecuci%n remota es &asada en Java ./I (m'todo remoto de
invocaci%n)" Esto permite !ue el c%digo de Java en un cliente invo!ue las llamadas del
m'todo en o&jetos !ue residen en otra computadora sin tener !ue mover a!u'llos
o&jetos al cliente"

JAI sigue un modelo o&jeto d%nde las imgenes # operadores de imagen son definidas
como o&jetos su&clasificados fuera de un padre com)n" 0n o&jeto del operador es el
instanciado con uno o ms fuentes de la imagen # otros parmetros" Este o&jeto del
operador puede volverse una fuente de la imagen entonces para el pr%ximo o&jeto del
operador" -as conexiones entre los o&jetos definen el flujo de datos procesados" Pueden
definirse los grficos del edita&le resultantes de imagen !ue procesa los
funcionamientos e instanciado como necesitado" JAI tam&i'n proporciona un armaz%n
extensi&le !ue permite agregar las soluciones personalizadas al central API"
#ANEJO AVANZADO DE I#%GENES
L&'()(*+ API ,D:
El API 2D de Java contiene grficos avanzados en dos dimensiones texto #
capacidades de manejo de imgenes para los programas Java a trav's de la extensi%n del
A12" Este pa!uete soporta l,neas art,sticas texto e imgenes siendo flexi&le potente
para desarrollar interfaces de usuario programas de di&ujo sofisticados # editores de
imgenes"
El API 2D de Java proporciona3

0n modelo de renderizado uniforme para pantallas e impresoras"

4rficos primitivos geom'tricos como curvas rectngulos # elipses # un


mecanismo para renderizar virtualmente cual!uier forma geom'trica"

/ecanismos para detectar es!uinas de formas texto e imgenes"

0n modelo de composici%n !ue proporciona control so&re c%mo se renderizan


los o&jetos solapados"

5oporte de color mejorado !ue facilita su manejo"

5oporte para imprimir documentos complejos"


-as capacidades de procesado de imgenes de Java se encuentran recogidas en el
pa!uete -+.+.+/0.&1+2)" Entre las mas importantes se pueden destacar3
I30)(4+5)6:
I1+2)P(od75)( I1+2)Co3671)(" I1+2)O'6)(.)(
-as clases !ue implementa el interfaz I1+2)P(od75)( sirven como fuentes de pixels"
-os m'todos de estas clases pueden generar los pixels a partir de la pantalla o puede
interpretar cual!uier otra fuente de datos como un fic(ero 4I$" 6o importa c%mo
genere los datos el principal prop%sito de un productor de imgenes es proporcionar
pixels a una clase I1+2)Co3671)("
-os productores de imgenes operan como fuentes de imgenes # el modelo
productor/consumidor !ue se sigue en el tratamiento de imgenes es el mismo !ue se
utiliza en el modelo fuente/receptor de eventos"
En particular los m'todos declarados en el interfaz I1+2)P(od75)( (acen posi&le !ue
uno o ms o&jetos I1+2)Co3671)( se registren para mostrar su inter's en una imagen"
El productor de la imagen invocar a los m'todos declarados en el interfaz
I1+2)Co3671)( para enviar pixels a los consumidores de imgenes"
0n productor de imgenes puede registrar muc(os consumidores de sus pixels de la
misma forma !ue una fuente de eventos puede registrar m)ltiples receptores de sus
eventos" En el interfaz ImageProducer (a# varios m'todos para manipular la lista de
consumidores por ejemplo para a7adir nuevos consumidores interesados en los pixels
del productor o para eliminar consumidores de la lista"
El interfaz I1+2)Co3671)( declara m'todos !ue de&en ser implementados por las
clases !ue reci&en datos desde un productor de imgenes" El principal de estos m'todos
es setPixels()"
void setPixels( intintintint8olor/odel&#te9:intint )
L+ 58+6) Co8o(#od)8
Dependiendo de c%mo se !uiera representar la imagen en pantalla un solo pixel puede
contener muc(a informaci%n o casi ninguna" Por ejemplo si se !uieren di&ujar una
serie de l,neas del mismo color so&re un fondo de un color diferente la )nica
informaci%n !ue de&e contener cada pixel es si de&e estar encendido o apagado es
decir !ue solamente ser,a necesario un &it de informaci%n para representar al pixel"
En el otro extremo de la informaci%n !ue puede recoger un pixel se encuentran los
grficos complejos de los juegos de ordenador !ue re!uieren ;2*&its para representar
un pixel individual" Estos ;2 &its se dividen en grupos de cuatro octetos de &its o &#tes"
2res de estos grupos representan la cantidad de colores fundamentales3 rojo verde #
azul !ue forman parte del color del pixel< # el cuarto &#te normalmente conocido con
&#te alpha se utiliza para representar la transparencia en un rango de = a 2>> siendo =
la transparencia total # 2>> la opacidad completa"
En teor,a este formato permite la utilizaci%n de ?@ millones de colores en cada pixel
individual aun!ue puede ser !ue el monitor o la tarjeta grfica no sean capaces de
visualizar electr%nicamente tal cantidad de colores" 8ada uno de los extremos se puede
considerar como un modelo de color" En Java un modelo de color determina cuntos
colores se van a representar dentro del A12" -a clase Co8o(#od)8 es una clase
a&stracta !ue se puede extender para poder especificar representaciones de color
propias"
0n modelo de color es necesario por!ue (a# muc(os m'todos !ue reci&en un arra# de
&#tes # convierten esos &#tes en pixeles para su presentaci%n en pantalla es decir
convierten los &#tes de datos en pixels visuales so&re la pantalla" Por ejemplo con un
modelo de color directo simple cada grupo de cuatro &#tes se podr,a interpretar como la
representaci%n de un valor del color de un pixel individual" En un modelo de color
indexado simple cada &#te en el arra# se podr,a interpretar como un ,ndice a una ta&la
de enteros de ;2 &its donde cada uno de esos enteres representa el valor del color
adscrito al pixel"
El A12 proporciona tres su&clases de Co8o(#od)83 I3d)9Co8o(#od)8
Co1:o3)30Co8o(#od)8 # P+5;)dCo8o(#od)8"
L+ 58+6) I3d)9Co8o(#od)8:
8uando se utilizan imgenes de alta resoluci%n se consume gran cantidad de memoria<
por ejemplo una imagen de dimensiones ?=2AxB@C contiene BC@"A;2 pixels
individuales" 5i se !uieren representar estos pixels con sus cuatro &#tes en memoria se
necesitarn ;"?A>"B2C &#tes de memoria para esta imagen"
Para evitar este rpido descenso de memoria se (an incorporado varios es!uemas de
forma !ue las imgenes se puedan representar de forma razona&le sin comprometer
demasiado el uso de memoria" 0n es!uema mu# com)n consiste en localizar un
pe!ue7o n)mero de &its para cada pixel (C &its por ejemplo) # luego utilizar los valores
de los pixels como un ,ndice a una ta&la de enteros de ;2 &its !ue contenga el
su&conjunto de todos los colores !ue se utilizan en la imagen" Por ejemplo si se utilizan
oc(o &its para representar un pixel el valor del pixel se puede utilizar como ,ndice a una
ta&la de contenga (asta 2>@ colores !ue se utilicen en la imagen" Estos 2>@ colores se
pueden seleccionar entre los millones disponi&les conoci'ndose a este su&conjunto
como la paleta de colores de la imagen"
L+ 58+6) D&()50Co8o(#od)8:
Esta clase se extiende a la clase P+5;)dCo8o(#od)8 e implementa el formato completo
de color de ;2*&it en el !ue cada pixel est formado por los cuatro &#tes representando
el canal alp(a # las cantidades de rojo verde # azul !ue componen cada pixel
L+ 58+6) F&80)()dI1+2)So7(5)
Esta clase es una implementaci%n del interfaz I1+2)P(od75)( !ue toma una imagen #
un o&jeto de tipo I1+2)F&80)( para generar una nueva imagen !ue es una versi%n
filtrada de la imagen original" -as operaciones de filtrado pueden realizar una gran
variedad de operaciones como son el desplazamiento # sustituci%n de colores la
rotaci%n de imgenes etc"
L+ 58+6) I1+2)F&80)(
Esta clase es una implementaci%n del interfaz I1+2)Co3671)(" Adems de los
m'todos declarados en el interfaz (a# m'todos para implementar un filtro nulo !ue no
realiza modificaci%n alguna so&re los datos !ue se le pasan"
Da# varias su&clases !ue extienden esta clase &ase para permitir la manipulaci%n de la
imagen como son RGBI1+2)F&80)( C(o:I1+2)F&80)( R):8&5+0)S5+8)F&80)( #
A()+A.)(+2&32S5+8)F&80)("
L+ 58+6) #)1o(<I1+2)So7(5)
Esta clase es una implementaci%n del interfaz I1+2)P(od75)( !ue utiliza un arra# de
datos para generar los valores de los pixels de una imagen" Dispone de varios
constructores !ue son3

Anc(o # alto en pixels de la imagen !ue va a ser creada

/odelo de color !ue se emplear en la conversi%n si el constructor no re!uiere


este parmetro utilizar el modelo de color .4E por defecto

0n arra# de &#tes o enteros conteniendo los valores a ser convertidos en pixel


seg)n el modelo de color especificado

0n offset para indicar el primer pixel dentro del arra#

El n)mero de pixels por l,nea en el arra#

0n o&jeto de tipo =+6>0+'8) conteniendo las propiedades asociadas de la


imagen en caso de !ue la (a#a
En todos los casos el constructor genera un o&jeto I1+2)P(od75)( !ue se utiliza como
un arra# de &#tes o enteros para generar los datos de un o&jeto I1+2)" Esta clase puede
pasar m)ltiples imgenes a consumidores interesados en ellas recordando a la
funcionalidad multiframe !ue ofrece el formato grfico GIF89a para producir
animaciones"
L+ 58+6) P&9)8G(+'')(
Esta es una clase de utilidad para convertir una imagen en un arra# de valores !ue
corresponden a sus pixels" Implementa el interfaz I1+2)Co3671)( !ue puede ser
acoplado a un o&jeto I1+2) o I1+2)P(od75)( para realizar cual!uier manipulaci%n de
esa imagen"
#ETODOS PARA #ANEJO DE I#$GENES
#?0odo6 d) C8&::&32
Clipping es el proceso por el !ue se define la zona del contexto grfico en la !ue se van
a realizar las modificaciones de los su&siguientes procesos de di&ujo" 8ual!uier pixel
!ue se encuentre fuera del rea de clipping permanecer inmune a toda modificaci%n"
-os m'todos !ue estn involucrados son varios unos !ue permiten fijar el rectngulo de
clipping # otros !ue permiten o&tener la zona de clipping actual"
clipect( int!int!int!int ) realiza la intersecci%n del rectngulo de clipping actual con el
formado por los parmetros !ue se pasan al m'todo" Este m'todo solamente se puede
utilizar para reducir el tama7o de la zona de clipping no para aumentarla"
get"lip() devuelve la zona de clipping actual como un o&jeto de tipo S>+:)
get"lip#ounds() devuelve el rectngulo !ue delimita el &orde de la zona de clipping
actual"
set"lip (int!int!int!int ) fija el rectngulo de clipping actual al indicado en las cuatro
coordenadas !ue se pasan como parmetro al m'todo"
Da# varias formas distintas para el m'todo dra$Image() !ue difieren
fundamentalmente en las posi&ilidades de manipulaci%n del m'todo # los parmetros
!ue (a# !ue pasar para realizar esas manipulaciones" -a siguiente llamada es solamente
representativa del grupo !ue se vern posteriormente"
dra$Image( Image!int!int!int!int!int!int!int!int!"olor!Image%&server ) pinta so&re la
zona indicada la imagen !ue se pasa como parmetro escalndola so&re la marc(a para
!ue rellene completamente el rea de destino"
6o o&stante antes de entrar en el desarrollo de los diferentes m'todos dra$Image()
!uiz sea presentar la clase Co8o( !ue es relativamente simple de entender # utilizar"
La clase Color
Esta clase es simple encapsula los colores utilizando el formato G#" En este formato
los colores se definen por sus componentes .ojo Ferde # Azul representado cada uno
de ellos por un n)mero entero en el rango =*2>>" En el caso del API Java2D el espacio
de color !ue se usa es el sG# un estndar del consorcio 1;"
Da# otro modelo de color llamado '(# (matiz saturaci%n # &rillo)" -a clase Co8o(
proporciona m'todos de conveniencia para poder realizar la conversi%n entre un modelo
# otro sin dificultad"
-a clase Co8o( proporciona varia&les estticas finales !ue permiten el uso de cual!uiera
de los treinta colores simplemente especificando su nom&re" Para usar estas varia&les
s%lo es necesario referencias el color por su nom&re de varia&le por ejemplo
o&jeto"setEacGground( 8olor"red )<
-os valores predefinidos para los colores en esta clase son los !ue se muestran en la
siguiente lista todos ellos en el espacio sG#3

&lac) negro

&lue azul

c*an azul celeste

dar)Gra* gris oscuro

gra* gris

green verde

lightGra* gris claro

magenta violeta

orange naranja

pin) rosa

red rojo

$hite &lanco

*ello$ amarillo
-os constructores de esta clase son tres dos de los cuales permiten instanciar un nuevo
o&jeto de tipo Co8o( indicando las cantidades de rojo verde # azul !ue entran en su
composici%n mediante valores enteros en el rango = a 2>>3
8olor( intintint )
El otro de los constructores !ue permite especificar la contri&uci%n de rojo verde # azul
al color final admite valore flotantes en el rango ="= a ?"=3
8olor( floatfloatfloat )
H el tercer constructor admite solamente un n)mero entero en el cual se especifica el
valor .4E de forma !ue la cantidad de color rojo !ue interviene en el color final est
especificada en los &its ?@*2; del argumento la cantidad de verde en los &its C*?> # la
cantidad de azul en los &its =*B"
8olor( int )
/'todos !ue devuelven un entero representando el valor .4E para un determinado
o&jeto Co8o("
geted() devuelve el componente rojo del color como un entero en el rango = a 2>>"
getGreen() devuelve la cantidad de verde !ue entra en la composici%n del o&jeto 8olor
en el rango = a 2>>"
get#lue() devuelve el componente azul del color con un entero en el rango = a 2>>"
getG#() devuelve un entero representando el color .4E utilizando los &its para
indicar la cantidad de cada uno de los componentes rojo verde # azul !ue entran en su
composici%n" -os &its 2A a ;? del entero !ue devuelve el m'todo son =xff los &its ?@ a
2; son el valor rojo los &its C a ?> son el valor verde # los &its = a B indican el valor del
color azul" 5iempre en el rango = a 2>>"
-os siguiente m'todos devuelven un o&jeto de tipo Co8o( de forma !ue se pueden
utilizar para crear o&jetos de este tipo"
&righter() crea una versi%n ms &rillante del color"
dar)er() crea una versi%n ms oscura del color"
decode( (tring ) convierte una cadena a un entero # devuelve el color correspondiente"
-os m'todos !ue se indican a continuaci%n tam&i'n devuelven un o&jeto de tipo Co8o(
pero estn especializados para tra&ajar con el sistema a trav's de la clase P(o:)(0&)6"
get"olor( (tring ) &usca un color entre las propiedades del sistema" El o&jeto S0(&32 se
utiliza como el valor clave en el es!uema claveIvalor utilizado para descri&ir las
propiedades en Java" El valor es entonces utilizado para devolver un o&jeto Co8o("
get"olor( (tring!"olor ) &usca un color entre las propiedades del sistema" El segundo
parmetro es el !ue se devuelve en el caso de !ue falle la &)s!ueda de la clave indicada
en el o&jeto S0(&32"
get"olor( (tring!int ) &usca un color entre las propiedades del sistema" El segundo
parmetro es utilizado para instanciar # devolver un o&jeto Co8o( en el caso de !ue falle
la &)s!ueda de la clave indicada en el o&jeto S0(&32"
-os siguientes m'todos se utilizan para realizar la conversi%n entre el modelo de color
G# # el modelo '(#"
get'(#"olor( float!float!float ) crea un o&jeto de tipo Co8o( &asado en los valores
proporcionados por el modelo D5E"
'(#toG#( float!float!float ) convierte los componentes de un color tal como se
especifican en el modelo D5E a su conjunto e!uivalente de valores en el modelo .4E"
G#to'(#( int!int!int!float+, ) convierte los componentes de un color tal como se
especifican en el modelo .4E a los tres componentes del modelo D5E"
H #a los m'todos !ue !uedan son m'todos de utilidad general sin ninguna aplicaci%n
espec,fica en lo !ue al Co8o( respecta"
e-uals( %&ject ) determina si otro o&jeto es igual a un color"
hash"ode() calcula el c%digo hash para un color"
to(tring() crea una cadena representando al color indicando el valor de sus
componentes .4E"
E8 1?0odo d(+/I1+2)@A:
Este m'todo es el !ue se utiliza para presentar una imagen en pantalla< aun!ue (a#
m'todos de otras clases !ue son utilizados para la manipulaci%n de imgenes en Java lo
primero !ue se necesita es sa&er c%mo se visualiza una imagen # eso es lo !ue (ace este
m'todo dra$Image() de la clase G(+:>&56"
dra$Image( Image!int!int!"olor!Image%&server ) pinta la imagen !ue se indica
situando su es!uina superior iz!uierda en la coordenada !ue se pasa en el contexto
grfico actual" -os pixeles transparentes se pintan en el color de fondo !ue se indica"
Esta operaci%n es e!uivalente a rellenar un rectngulo del anc(o # alto de la imagen
dada con un color # luego pintar la imagen so&re 'l aun!ue pro&a&lemente ms
eficiente"
dra$Image( Image!int!int!Image%&server ) pinta la imagen !ue se indica situando su
es!uina superior iz!uierda en la coordenada !ue se pasa en el contexto grfico actual"
-os pixeles transparentes de la imagen no se ven afectados" Este m'todo retorna
inmediatamente en todos los casos incluso aun!ue la imagen completa no se (a#a
terminado de cargar # no se (a#a presentado completamente en el dispositivo de salida"
dra$Image( Image!int!int!int!int!"olor!Image%&server ) pinta la imagen !ue se pasa
dentro del rectngulo !ue se indica en los parmetros escalando esa imagen si es
necesario" El m'todo retorna inmediatamente aun!ue la imagen no se (a#a cargado
completamente" 5i la representaci%n de la imagen en el dispositivo de salida no se (a
completado entonces dra$Image() devuelve el valor false"
dra$Image( Image!int!int!int!int!Image%&server ) pinta la imagen !ue se pasa dentro
del rectngulo !ue se indica en los parmetros escalando esa imagen si es necesario" El
m'todo retorna inmediatamente aun!ue la imagen no se (a#a cargado completamente"
5i la representaci%n de la imagen en el dispositivo de salida no se (a completado
entonces dra$Image() devuelve el valor false" El proceso !ue pinta las imgenes
notifica al o&servador a trav's de su m'todo image.pdate()"
dra$Image( Image!int!int!int!int!int!int!int!int!"olor!Image%&server )"
dra$Image( Image!int!int!int!int!int!int!int!int!Image%&server )"
Ejemplo llamada a metodo3
pu&lic a&stract &oolean draJImage( Image img
int x
int #
int Jidt(
int (eig(t
ImageK&server o&server )
-os parmetros del m'todo son3
img la imagen !ue se !uiere pintar
x e # coordenadas para posicionar la es!uina superior iz!uierda de la imagen
Jidt( # (eig(t dimensiones del rectngulo so&re el !ue se posicionar la imagen
o&server o&jeto !ue (a de ser notificado tan pronto como la imagen se (a#a convertido
# situado en su posici%n
En esta versi%n del m'todo la imagen se pintar dentro del rectngulo !ue se para en
los parmetros # se escalar si es necesario" El m'todo retorna inmediatamente incluso
aun!ue la imagen no se (a#a terminado de escalar o convertir al formato !ue admita el
dispositivo de salida" 5i esta conversi%n no se (a completado dra$Image() devuelve
false # como (a# parte de imagen !ue no est procesada el proceso !ue pinta la imagen
notifica al o&servador a trav's de su m'todo image.pdate() # esa imagen contin)a
pintndose por trozos"
El m'todo image.pdate() pertenece a la clase Co1:o3)30 cuando es llamado encola
una llamada a repaint() permitiendo !ue se pinta un trozo ms de imagen sin !ue se
interfiera la tarea o (ilo de control principal" Da# tam&i'n una propiedad
+/0.&1+2).&35()1)30+8d(+/ !ue determina si la imagen puede ser pintada en piezas
tal como se (a indicado antes" El valor por defecto para esta propiedad es true en cu#o
caso el sistema va pintado trozos de imagen seg)n van llegando" 5i el valor es false el
sistema esperar a !ue la imagen est' completamente cargada antes de pintarla"
Da# una segunda propiedad +/0.&1+2).()d(+/(+0) !ue determina el per,odo m,nimo
en milisegundos !ue de&e (a&er entre llamadas a repaint() para imgenes" El valor por
defecto es ?== # solamente se aplica cuando la propiedad anterior es true" 2anto esta
propiedad como la anterior se pueden modificar pero solamente sirve esa modificaci%n
para la ejecuci%n actual del programa"
De los parmetros !ue se pasan al m'todo dra$Image() todos resultan o&vios excepto
!uiz el )ltimo de ellos o&server !ue se refiere al o&jeto !ue de&e ser notificado
cuando la imagen est' disponi&le" 8uando se realiza una llamada a dra$Image() se
lanza una tarea !ue carga la imagen solicitada" Da# un o&servador !ue monitoriza el
proceso de carga< la tarea !ue est cargando la imagen notifica a ese o&servador cada
vez !ue llegan nuevos datos" Para este parmetro se puede utilizar perfectamente t(is
como o&servador en la llamada a dra$Image()< es ms se puede decir !ue cual!uier
componente puede servir como o&servador para imgenes !ue se pintan so&re 'l" Luiz
sea este el momento de entrar un poco ms en detalle en la clase I1+2)O'6)(.)( e
incluso antes en la clase I1+2) por!ue son los dos parmetros diferentes del t,pico
entero !ue aparecen en la llamada a dra$Image()"
L+ 58+6) I1+2):
-a clase I1+2) como cual!uier otra est formada por una serie de constantes o
varia&les constructores # m'todos" 0no de estos m'todos es get5caledInstance() !ue
devuelve una versi%n escalada de una imagen" 0no de los parmetros de este m'todo es
un valor entero !ue especifica el algoritmo a utilizar para la realizaci%n del escalado" 5e
puede utilizar cual!uiera de ellos la ta&la siguiente muestra su nom&re # una pe!ue7a
descripci%n si el lector necesita ms detalles de&e recurrir como siempre se
recomienda a la documentaci%n del JDM"
58A-ENA.EANAFE.A4I64 utiliza el algoritmo Area Averaging
58A-EN$A52 utiliza un algoritmo !ue proporcione ma#or rapidez en el escalado a
costa de la suavidad de realizaci%n de ese escalado
58A-EN5/KK2D al contrario !ue el anterior sacrifica la velocidad por la suavidad
de realizaci%n del escalado
58A-EN.EP-I8A2E utiliza un algoritmo de los internos de la clase
.eplicate5cale$ilter
58A-ENDE$A0-2 utiliza el algoritmo de defecto
0ndefinedPropert# un o&jeto de este tipo de&e ser retornado siempre !ue una propiedad
no se encuentre definida para una determinada imagen" Esta propiedad no se utiliza para
el escalado sino !ue es utilizada como valor de retorno del m'todo getProperties() para
indicar !ue la propiedad solicitada no est disponi&le"
Aun!ue la clase I1+2) dispone de un constructor es una clase a&stracta por lo !ue no
se puede instanciar ning)n o&jeto llamando directamente a este constructor" 5e puede
conseguir un o&jeto I1+2) indirectamente por la invocaci%n del m'todo getImage() de
las clases A::8)0 o Too8;&0" El m'todo getImage() utiliza un (ilo de ejecuci%n o tarea
separado para cargar la imagen" El resultado prctico de la invocaci%n a getImage() es
la asociaci%n entre una referencia de tipo I1+2) # un fic(ero localizado en alg)n lugar
!ue contiene la imagen !ue interesa" Ktra forma de o&tener un o&jeto I1+2) es invocar
al m'todo createImage() de las clases Co1:o3)30 # Too8;&0" -a lista siguiente
muestra una pe!ue7a descripci%n de los m'todos de la clase I1+2)3
flush() li&era todos los recursos !ue utiliza el o&jeto Image
getGraphics() crea un contexto grfico para pintar una imagen en segundo plano
get'eight( Image%&server ) determina la altura de la imagen
get/idth( Image%&server ) determina la anc(ura de la imagen
getPropert*( (tring!Image%&server ) o&tiene una propiedad de la imagen por su
nom&re
get(caledInstance( int!int!int ) crea una versi%n escalada de la imagen
get(ource() devuelve el o&jeto !ue produce los pixeles de la imagen
Algunos de estos m'todos se utilizarn en los ejemplos !ue se presentan" 6o o&stante el
inter's no de&e centrarse solamente en la clase I1+2) sino tam&i'n en las otras clases
!ue se necesitan para instanciar los parmetros de llamada a estos m'todos e incluso
algunas otras clases de soporte general" Por ello a)n a costa de resultar un poco ladrillo
se presenta a continuaci%n una pe!ue7a revisi%n de las clases ms interesantes
#)d&+T(+5;)( e I1+2)P(od75)( #a !ue so&re las clases S0(&32 I1+2)O'6)(.)(
G(+:>&56 # O'-)50 !ue son las !ue intervienen en los m'todos de la clase Image
E8 &30)(4+B I1+2)P(od75)(:
5e trata de un interfaz para o&jeto !ue pueden producir imgenes para la clase I1+2)"
8ada imagen contiene un I1+2)P(od75)( !ue se utiliza en la reconstrucci%n de esa
imagen cuando es necesario< por ejemplo cuando se escala la imagen o cuando se
cam&ia la imagen de tama7o
L+ 58+6) #)d&+T(+5;)(:
Esta es una clase de utilidad general dise7ada para controlar el estado de los o&jetos de
tipo media !ue en teor,a pueden ser tanto clips de sonido como cual!uier otro o&jeto
media como es el caso de una imagen"
0n o&jeto #)d&+T(+5;)( se utiliza a trav's de una instancia de la clase #)d&+T(+5;)(
so&re el o&jeto Co1:o3)30 !ue se !uiere monitorizar e invocando al m'todo
addImage() para cada una de las imgenes !ue se !uiere controlar" A cada una de estas
imgenes se puede asignar un identificador )nico o tam&i'n se puede asignar el mismo
identificador a un grupo de imgenes" Este identificador controla el orden de prioridad
en !ue se cargarn las imgenes de forma !ue imgenes con un identificador &ajo
tienen preferencia so&re otras con identificador ms alto" El identificador tam&i'n se
puede utilizar para identificar un conjunto )nico de imgenes" En otras pala&ras
asignando el mismo identificador a varias imgenes se las puede manejar a la vez"
5e puede determinar el estado de una imagen (o grupo de imgenes) invocando alguno
de los distintos m'todos so&re el o&jeto #)d&+T(+5;)( pasndole como parmetro el
identificador de la imagen (o grupo de imgenes)"
El o&jeto #)d&+T(+5;)( tam&i'n se puede utilizar para &lo!uear la ejecuci%n a la
espera de la carga completa de una imagen (o grupo de imgenes"
-a clase #)d&+T(+5;)( proporciona cuatro constantes !ue se utilizan como valores de
retorno de algunos de los m'todos de la clase # tal como su nom&re sugiere indican el
estado en !ue se encuentra una imagen dada" Estas constantes son las siguientes"
AEK.2ED la carga de la imagen (o cual!uier media) (a sido a&ortada
8K/P-E2E realizara satisfactoriamente la carga completa
E..K.ED se (a encontrado alg)n tipo de error en la carga
-KADI64 se est cargando la imagen (o cual!uier media)
Para esta clase solamente (a# un constructor !ue pueda ser invocado a la (ora de
instanciar o&jetos !ue controlen el estado de algunas o todas las imgenes so&re un
determinado componente"
#)d&+T(+5;)(@ Co1:o3)30 A:
0n o&jeto #)d&+T(+5;)( tiene la posi&ilidad de controlar el estado de algunas o todas
las imgenes !ue estn siendo cargadas para el o&jeto Co1:o3)30 !ue se (a pasado
como parmetro a la (ora de instanciar ese o&jeto #)d&+T(+5;)(" -os m'todos
siguientes se utilizan para crear # mantener esta lista de imgenes" 8uando se a7ade una
imagen a la lista (a# !ue proporcionar un identificador num'rico para esa imagen !ue
ser luego el !ue sea utilizado por otros m'todos para poder indicar el estado en !ue se
encuentra una imagen determinada"
addImage( Image!int ) incorpora una nueva imagen a la lista de imgenes !ue est
siendo controlada por el o&jeto #)d&+T(+5;)("
addImage( Image!int!int!int ) incorpora una imagen escalada a la lista"
removeImage( Image ) elimina la imagen indicada de la lista"
removeImage( Image!int ) elimina la imagen !ue corresponde al identificador !ue se
pasa como parmetro de la lista"
removeImage( Image!int!int!int ) elimina la imagen !ue corresponde al anc(o alto e
identificador de la lista de imgenes"
El o&jeto #)d&+T(+5;)( se puede utilizar para (acer !ue la tarea o (ilo de ejecuci%n
se &lo!uee (asta !ue una o ms imgenes de su lista (a#a completado su carga" Esto se
consigue con los siguientes m'todos"
$aitFor0ll() inicia la carga de todas la imgenes controladas por el o&jeto
#)d&+T(+5;)(< devuelve void"
$aitFor0ll( long ) inicia la carga de todas la imgenes devolviendo true si todas las
imgenes se (an cargado # false en cual!uier otro caso"
$aitForI1( int ) inicia la carga de las imgenes !ue corresponden al identificador !ue
se pasa< devuelve void"
$aitForI1( int!long ) inicia la carga de las imgenes !ue corresponden al identificador
!ue se pasa< devuelve true si todas las imgenes se (an cargado # false en cual!uier otro
caso"
Por supuesto es posi&le utilizar m'todos !ue no &lo!uean la tarea !ue carga las
imgenes para compro&ar el estado de una o ms imgenes de la lista" Esto permite
continuar (aciendo el tra&ajo mientras las imgenes siguen cargndose" Estos m'todos
devuelven true o false para indicar si la carga es completa" -a versi%n con el parmetro
&ooleano comenzar la carga de cual!uier imagen !ue no se est' cargando en caso de
!ue ese parmetro &ooleano sea true" -a otra versi%n no iniciar la carga de ninguna
imagen" Esta interpretaci%n tam&i'n es vlida para el parmetro &ooleano de otros
m'todos de la clase !ue disponen de 'l"
chec)0ll() # chec)0ll( &oolean ) comprue&an si todas las imgenes !ue estn siendo
controladas por el o&jeto #)d&+T(+5;)( (an finalizado la carga"
chec)I1( int ) # chec)I1( int!&oolean ) comprue&an si todas las imgenes !ue
corresponden al identificador especificado (an concluido su carga"
El (ec(o de !ue los m'todos anteriores indi!uen !ue la carga de las imgenes (a sido
completa no garantiza !ue esa carga est' li&re de errores" -os siguiente m'todos se
utilizan para determinar si se (a producido alg)n pro&lema durante la carga de las
imgenes"
get2rrors0n*() devuelve una lista de todas las imgenes (o cual!uier media) en los !ue
se (a producido un error en la carga"
get2rrors0n*( int ) devuelve una lista de todas las imgenes correspondientes a un
determinado identificador en los !ue se (a producido un error en la carga"
is2rror0n*() comprue&a el estado de error de todas las imgenes"
is2rrorI1( int ) comprue&a el estado de error de todas las imgenes correspondientes a
un determinado identificador"
-os dos siguientes m'todos devuelven un valor entero formado por la operaci%n K.
entre los valores de estado de todas las imgenes !ue se re!uieren< en el primero de
todas las !ue controla el o&jeto #)d&+T(+5;)( # en el segundo de las !ue
corresponden al identificador !ue se especifica"
status0ll( &oolean )
statusI1( int!&oolean )
GRAFICOS CON JAVA ,D
I1C2)3)6
El API 2D de Java implementa un nuevo modelo de imagen !ue soporta la
manipulaci%n de imgenes de resoluci%n fija almacenadas en memoria" 0na nueva clase
Image en el pa!uete java"aJt"image se puede usar EufferedImage para manipular datos
de una imagen recuperados desde un fic(ero o una 0.-" Por ejemplo se puede usar un
EufferedImage para implementar do&le &uffer ** los elementos grficos son di&ujados
fuera de la pantalla en el EufferedImage # luego son copiados a la pantalla a trav's de
llamadas al m'todo draJImage de 4rap(ics2D" -as clases EufferedImage #
EufferedImageKp tam&i'n permiten realizar una gran variedad de operaciones de
filtrado de imgenes como &lur" El modelo de imagen productorIconsumidor
proporcionado en las versiones anteriores del JDM sigue siendo soportado por razones
de compati&ilidad
S&60)1+ d) Coo(d)3+d+6
El sistema 2D de Java mantiene dos espacios de coordenadas3

El espacio de usuario es el espacio en !ue se especifican los grficos primitivos"

El espacio de dispositivo es el sistema de coordenadas para un diopositivo de


salida como una pantalla una ventana o una impresora"
El espacio de usuario es un sistema de coordenadas l%gicas independiente del
dispositivo3 el espacio de coordenas !ue usan nuestros programas" 2odos los
geom'tricos pasados a las rutinas Java 2D de renderizado se especifican en coordenadas
de espacio de usuario"
8uando se utiliza la transformaci%n por defecto desde el espacio de usuario al espacio
de dispositivo el origen del espacio de usuario es la es!uina superior iz!uierda del rea
de di&ujo del componente" -a coordena O se incrementa (acia la derec(a # la coordena
H (acia a&ajo"
El espacio de dispositivo es un sistema de coordenadas dependiente del dispositivo !ue
var,a de acuerdo a la fuente del dispositivo" Aun!ue el sistema de coordenas para una
ventana o una pantalla podr,a ser mu# distinto !ue para una impresora estas diferencias
son invisi&les para los programas Java" -as conversiones necesarias entre el espacio de
usuario # el espacio de dispositivo se realizan automticamente durante el di&ujado"
Co360(7&( Fo(1+6 Co1:8)-+6 d)6d) G)o1?0(&5o6 P(&1&0&.o6
8onstruir un rea geom'trica (8A4) es el proceso de crear una nueva forma geom'trica
realizando operaciones con las #a existentes" En el API Java 2D un tipo especial de
5(ape llamado Area soporta operaciones &ooleanas" Podemos construir un Area desde
cual!uier 5(ape "
Area soporta la siguientes operaciones &ooleanas3
0ni%n 5u&tracci%n
Intersecci%n Kr*Exclusivo (OK.)
Ejemplo3 Areas
En este ejemplo los o&jetos Area constru#en una forma de pera partiendo de varias
elipses"
G(C4&5o6 )3 , D&1)36&o3)6:
El API 2D de Java permite fcilmente3

Di&ujar l,neas de cual!uier anc(ura

.ellenar formas con gradientes # texturas

/over rotar escalar # recortar texto # grficos"

8omponer texto # grficos solapados"


Por ejemplo se podria mostrar grficos # c(arts complejos !ue usan varios estilos de
l,nea # de relleno para distinguir conjuntos de datos como se muestra en la siguiente
figura3
El API 2D de Java tam&i'n permite almacenar datos de imgenes**por ejemplo se
puede realizar fcilmente filtros de imgenes como &lur o recortado como se muestra
en la siguiente figura3
Fo(1+6 ,D
-as clases del pa!uete java"aJt"geom definen grficos primitivos comunes como
puntos l,neas curvas arcos rectngulos # elipses"
8lases en el pa!uete java"aJt"geom
Arc2D Ellipse2D Luad8urve2D
Area 4eneralPat( .ectangle2D
8u&ic8urve2D -ine2D .ectangular5(ape
Dimension2D Point2D .ound.ectangle2D
Excepto para Point2D # Dimension2D cada una de las otras clases geom'tricas
implementa el interface 5(ape !ue proporciona un conjunto de m'todos comunes para
descri&ir e inspeccionar o&jetos geom'tricos &i*dimensionales"
8on estas clases se puede crear de forma virtual cual!uier forma geom'trica # di&ujarla
a trav's de 4rap(ics2D llamando al m'todo draJ o al m'todo fill" Por ejemplo las
formas geom'tricas del siguiente applet estn definidas usando los geom'tricos &sicos
de Java 2D"
$ormas .ectangulares
-os primitivos .ectangle2D .ound.ectangle2D Arc2D # Ellipse2D descienden del
.ectangular5(ape !ue define m'todos para o&jetos 5(ape !ue pueden ser descritos por
una caja rectngular" -a geometr,a de un .ectangular5(ape puede ser extrapolada desde
un rectngulo !ue encierra completamente el exterior de la 5(ape"
Luad8urve2D # 8u&ic8urve2D
-a clase Luad8urve2D nos permite crear segmentos de curvas cuadrticos" 0na curva
cuadrtica est definida por dos puntos finales # un punto de control"
-a clase 8u&ic8urve2D nos permite crear segmentos de curvas c)&icos" 0na curva
c)&ica est definida por dos puntos finales # dos puntos de control" -as siguientes
figuras muestran ejemplos de curvas cuadrticas # c)&icas"
4eneralPat(
-a clase 4eneralPat( permite crear una curva ar&itraria especificando una serie de
posiciones a lo largo de los l,mites de la forma" Estas posiciones pueden ser conectadas
por segmentos de l,nea curvas cuadrticas o curvas c)&icas" -a siguiente figura puede
ser creada con ; segmentos de l,nea # una curva c)&ica"
Areas
8on la clase Area se realiza operaciones &oolenas como uniones intersecciones #
su&stracciones so&re dos o&jetos 5(ape cuales!uiera" Esta t'cnica permite crear
rpidamente o&jetos 5(ape complejos sin tener !ue descri&ir cada l,nea de segmento o
cada curva"
Co30(o8+( 8+ C+8&d+d d)8 D&'7-o:
5e puede usar el atri&uto Prendering (intP de 4rap(ics2D para especificar !ue los
o&jetos sean di&ujados tan rpido como sea posi&le o !ue se di&ujen con la ma#or
calidad posi&le"
Para seleccionar o configurar el atri&uto Prendering (intP en el contexto 4rap(ics2D se
puede construir un o&jeto .enderingDints # pasarlo dentro de
4rap(ics2D"set.enderingDints" 5i s%lo se !uiere seleccionar un (int se llama a
4rap(ics2D" set.enderingDint # especificar la pareja clave*valor para el (int !ue se
desea seleccionar"
.enderingDints soporta los siguientes tipos de (ints"

Alp(a interpolation**por defecto calidad o velocidad"

Antialiasing**por defecto on u off

8olor rendering*por defecto calidad o velocidad

Dit(ering**por defecto activado o desactivado

$ractional metrics**por defecto on u off

Interpolation**vecino ms cercano &ilinear o &ic)&ico

.endering**por defecto calidad o velocidad

2ext antialiasing**por defecto on u off"


R)3d)(&B+do )3 J+.+ ,D
El mecanismo de renderizado &sico es el mismo !ue en las versiones anteriores del
JDM el sistema de di&ujo controla cundo # c%mo di&uja un programa" 8uando un
componente necesita ser mostrado se llama automticamente a su m'todo :+&30 o
7:d+0) dentro del contexto G(+:>&56 apropiado"
El API 2D de Java presenta java"aJt"4rap(ics2D un nuevo tipo de o&jeto G(+:>&56"
G(+:>&56,D desciende de la clase 4rap(ics para proporcionar acceso a las
caracter,sticas avanzadas de renderizado del API 2D de Java"
Para usar las caracter,sticas del API 2D de Java se forza el o&jeto G(+:>&56 pasado al
m'todo de di&ujo de un componente a un o&jeto G(+:>&56,D"
pu&lic void Paint (4rap(ics g) Q
4rap(ics2D g2 R (4rap(ics2D) g< """
S
Co30)90o d) R)3d)(&B+do d) G(+:>&56,D
Al conjunto de atri&utos de estado asociados con un o&jeto G(+:>&56,D se le conoce
como Co30)90o d) R)3d)(&B+do d) G(+:>&56,D" Para mostrar texto formas o
imgenes se configura este contexto # luego se llama a uno de los m'todos de
renderizado de la clase G(+:>&56,D como d(+/ o 4&88 " 8%mo muestra la siguiente
figura el contexto de renderizado de G(+:>&56,D contiene varios atri&utos"
El estilo de lpiz !ue se aplica al exterior de una forma" Este atri&uto
60(o;) nos permite di&ujar l,neas con cual!uier tama7o de punto # patr%n
de som&reado # aplicar finalizadores # decoraciones a la l,nea"
El estilo de relleno !ue se aplica al interior de la forma" Este atri&uto :+&30
nos permite rellenar formas con c%lores s%lidos gradientes o patrones"
El estilo de composici%n se utiliza cuando los o&jetos di&ujados se solapan
con o&jetos existentes"
-a transformaci%n !ue se aplica durante el di&ujado para convertir el
o&jeto di&ujado desde el espacio de usuario a las coordenadas de espacio
del dispositivo" 2am&i'n se pueden aplicar otras transformaciones
opcionales como la traducci%n rotaci%n escalado recortado a trav's de
este atri&uto"
El 8lip !ue restringe el di&ujado al rea dentro de los &ordes de la S>+:)
se utiliza para definir el ra de recorte" 5e puede usar cual!uier S>+:)
para definir un clip"
-a 47)30) se usa para convertir cadenas de texto"
Punto de .enderizado !ue especifican las preferencias en cuanto a
velocidad # calidad" Por ejemplo podemos especificar si se de&er,a usar
antialiasing si est disponi&le"
Para configurar un atri&uto en el contexto de renderizado de G(+:>&56,D se usan los
m'todos 6)0 A00(&'70)"

6)0S0(o;)

6)0P+&30

6)0Co1:o6&0)

6)0T(+364o(1

6)0C8&:

6)0Fo30

6)0R)3d)(&32=&306
8uando se configura un atri&uto se le pasa al o&jeto el atri&uto apropiado" Por ejemplo
para cam&iar el atri&uto paint a un relleno de gradiente azul*gris se de&er,a construir el
o&jeto G(+d&)30P+&30 # luego llamar a 6)0P+&30"
gp R neJ 4radientPaint(=f=f&lue=f;=fgreen)<
g2"setPaint(gp)<
G(+:>&56,D contiene referencias a sus o&jetos atri&utos ** no son clonados" 5i
modificamos un o&jeto atri&uto !ue forma parte del contexto G(+:>&56,D necesitamos
llamar al m'todo 6)0 para notificarlo al contexto" -a modificaci%n de un atri&uto de un
o&jeto durante el renderizado puede causar comportamientos impredeci&les"
#?0odo6 d) ()3d)(&B+do d) G(+:>&56,D
G(+:>&56,D proporciona los siguientes m'todos generales de di&ujado !ue pueden
usarser para di&ujar cual!uier primitivo geom'trico texto o imagen"

d(+/**di&uja el exterior de una forma geom'trica primitiva usando los atri&utos


stroGe # paint"

4&88**di&uja cual!uier forma geom'trica primitiva rellenado su interior con el


color o patr%n especificado por el atri&uto paint"

d(+/S0(&32**di&uja cual!uier cadena de texto" El atri&uto font se usa para


convertir la fuente a gl#p(s !ue luego se rellenan con el color o patr%n
especificados por el atri&uto paint"

d(+/I1+2)**di&uja la imagen especificada"


Adems G(+:>&56,D soporta los m'todos de renderizado de G(+:>&56 para formas
particulares como d(+/O.+8 # 4&88R)50"
Co1:o3)( G(C4&5o6:
-a clase A8:>+Co1:o6&0) encapsula varios estilos de composici%n !ue determinan
c%mo se di&ujan los o&jetos solapados" 0n A8:>+Co1:o6&0) tam&i'n puede tener un
valor alp(a !ue especifica el grado de transparencia3 alp(a R ?"= es totalmente opaco
alp(a R ="= es totalmente transparente" A8:>+Co1:o6&0) soporta la ma#or,a de los
estndares de composici%n como se muestra en la siguiente ta&la"
5ource*over (SRCDOVER) 5i los pixels del o&jeto !ue est siendo renderizado (la
fuente) tienen la misma posici%n !ue los pixels
renderizados pr'viamente (el destino) los pixels de la
fuente se renderizan so&re los pixels del destino"
5ource*in (SRCDIN) 5i los pixels de la fuente # el destino se solapan s%lo se
renderizarn los pixels !ue (a#a en el rea solapada"
5ource*out (SRCDOUT) 5i los pixels de la fuente # el destino se solapan s%lo se
renderizarn los pixels !ue (a#a fuera del rea solapada"
-os pixels !ue (a#a en el rea solapada se &orrarn"
Destination*over
(DSTDOVER)
5i los pixels de la fuente # del destino se solapan s%lo se
renderizarn los pixels de la fuente !ue (a#a fuera del rea
solapada" -os pixels !ue (a#a en el rea solapada no se
cam&ian"
Destination*in (DSTDIN) 5i los pixels de la fuente # del destino se solapan el alp(a
de la fuente se aplica a los pixels del rea solapada del
destino" 5i el alp(a R ?"= los pixels del rea solapada no
cam&ian< si alp(a es ="= los pixels del rea solapada se
&orrarn"
Destination*out
(DSTDOUT)
5i los pixels de la fuente # del destino se solapan se aplica
el alp(a de la fuente a los pixels del rea solapada del
destino" 5i el alp(a R ?"= los pixels del rea solapada no
cam&ian< si alp(a es ="= los pixels del rea solapada se
&orrarn"
8lear (CLEAR) 5i los pixels de la fuente # del destino se solapan los pixels
del rea solapada se &orrarn"
Para cam&iar el estilo de composici%n usado por G(+:>&56,D se crea un o&jeto
A8:>+Co1:o6&0) # se pasa al m'todo 6)0Co1:o6&0)"
E-)1:8o: Co1:o6&0)
Este programa ilustra los efectos de varias com&inaciones de estilos de composici%n #
valores de alp(a"
5e (a construido un nuevo o&jeto A8:>+Co1:o6&0) +5 llamando a A8:>+Co1:o6&0)"
2)0I360+35) # especificando las reglas de composici%n deseadas"
Alp(a8omposite ac R
Alp(a8omposite"getInstance(Alp(a8omposite"5.8)<
8uando se selecciona una regla de composici%n o un valor alp(a se llama de nuevo a
A8:>+Co1:o6&0).2)0I360+35) # el nuevo A8:>+Co1:o6&0) se asigna a +5" El alp(a
seleccionado se aplica al valor alp(a de cada pixel # se le pasa un segundo parmetro a
A8:>+Co1:o6&0)"2)0I360+35)"
ac R Alp(a8omposite"getInstance(get.ule(rule) alp(a)<
El atri&uto composite se modifica pasando el o&jeto A8:>+Co1:o6&0) a G(+:>&56 ,D
6)0Co1:o6&0)" -os o&jetos son renderizados dentro de un B744)()dI1+2) # ms tarde
se copian en la pantalla por eso el atri&uto composite se configura con el contexto
G(+:>&56,D para el B744)()dI1+2)"
EufferedImage &uffImg R neJ EufferedImage(J (
EufferedImage"2HPENI62NA.4E)<
4rap(ics2D g&i R &uffImg"create4rap(ics()<"
g&i"set8omposite(ac)<
#o60(+( < #+3&:78+( I1C2)3)6
Esta lecci%n muestra c%mo realizar operaciones de filtrado con B744)()dI1+2)6 # c%mo
usar un EufferedImage como un &uffer fuera de pantalla"
#odo I31)d&+0o 5o3 B744)()dI1+2)
Esta secci%n descri&e el modelo de modo inmediato implementado en el API Java 2D #
explica como B744)()dI1+2) permite la manipulaci%n de datos de imgenes"
F&80(+do < B744)()dI1+2)
Esta secci%n muestra c%mo usar las clases B744)()dI1+2)O: para realizar operaciones
de filtrado so&re B744)()dI1+2)"
U6+( 73 B744)()dI1+2) :+(+ do'8) '744)(
Esta secci%n nos ense7a c%mo usar un B744)()dI1+2) como un &uffer fuera de pantalla
para aumentar el rendimiento de las imgenes"
#odo I31)d&+0o 5o3 B744)()dI1+2)
El modelo de imgenes +modo inmediato+ permite manipular # mostrar imgenes de
pixels mapeados cu#os datos estn almacenados en memoria" 5e puede acceder a los
datos de la imagen en una gran variedad de formatos # usar varios tipos de operaciones
de filtrado para manipular los datos"
B744)()dI1+2) es la clase clave del API del modo*inmediato" Esta clase maneja una
imagen en memoria # proporciona m'todos para almacenar interpretar # di&ujar cada
dato de pixel" 0n B744)()dI1+2) puede ser renderizado en un contexto G(+:>&56 o on
un contexto G(+:>&56,D"
0n B744)()dI1+2) es esencialmente un I1+2) un &uffer de datos accesi&le" 0n
B744)()dI1+2) tiene un Co8o(#od)8 # un R+60)( de los datos de la imagen"
El Co8o(#od)8 proporciona una interpretaci%n de color de los datos de los pixels de la
imagen" El R+60)( representa las coordenadas rectangulares de la imagen mantiene los
datos de la imagen en memoria # proporciona un mecanismo para crear m)ltiples
su&imagenes de un s%lo &uffer de imagen" El R+60)( tam&i'n proporciona m'todos para
acceder a pixels espec,ficos dentro de la imagen"
F&80(+( 73 B744)()dI1+2)
El API Java 2D define varias operaciones de filtrado para o&jetos EufferedImage " 8ada
operaci%n de proceso de imgenes est incluida en una clase !ue implementa el
interface EufferedImageKp" -a manipulaci%n de imgenes se realiza en el m'todo filter"
-a clase EufferedImageKp en el API Java 2D soporta3

2ranformaci%n afin"

Escalado"

/odificaci%n de Aspecto"

8om&inaci%n -inear de Eandas"

8onversi%n de color"

8onvoluci%n"
Para filtrar un EufferedImage usando una de las clases de operaci%n de imagen se
de&e3
?" 8onstuir un ejemplar de una de las clases EufferedImageKp3
Affine2ransformKp Eand8om&ineKp 8olor8onvertKp 8onvolveKp
-ooGupKp o .escaleKp"
2" -lamar al m'todo de operaci%n filter pasando en el EufferedImage !ue
!ueremos filtrar # el EufferedImage donde !ueremos almacenar el resultado"
Ejemplo3 ImageKps
El siguiente applet ilustra el uso de cuatro operaciones de filtrado de imagenes3 loJ*
pass s(arpen looGup # rescale"
El filtro s(arpen se realiza usando un 8onvolveKp" 8onvoluci%n es el proceso de (acer
ms pesado el valor de cada pixel en una imagen con los valores de los pixels vecinos"
-a ma#or,a de los algoritmos de filtrado espacial estn &asados en las operaciones de
convoluci%n"
Para construir # aplicar este tipo de filtrado al EufferedImage este ejemplo usa un
c%digo similar al del siguiente fragmento"
pu&lic static final float9: 5DA.PE6;x; R Q
="f *?"f ="f
*?"f >"=f *?"f
="f *?"f ="fS<
EufferedImage dst&img R neJ
EufferedImage(iJi(EufferedImage"2HPENI62N.4E)<
Mernel Gernel R neJ Mernel(;;5DA.PE6;x;)<
8onvolveKp cop R neJ 8onvolveKp(Gernel
8onvolveKp"ED4EN6KNKP
null)<
cop"filter(src&imgdst&img)<
El o&jeto Mernel define matemticamente c%mo se ve afectada la salida de cada pixels
en su rea inmediata" -a definici%n del Mernel determina el resultado del filtro"
So:o(0+( I30)(+55&E3 5o3 )8 U67+(&o:
Para permitir !ue el usuario interact)e con los graficos !ue se di&ujan se re!uiere
poder determinar cuando el usuario pulsa so&re uno de ellos" El m'todo (it de
4rap(ics2D proporciona una forma para determinar fcilmente si (a ocurrido una
pulsaci%n de rat%n so&re una 5(ape particular" De forma alternativa podemos o&tener la
posici%n del clicG de rat%n # llamar a contains so&re la 5(ape para determinar si el clicG
ocurri% dentro de los l,mites de la 5(ape"
5i estamos usando texto primitvo podemos realizar una simple compro&aci%n
o&teniendo la l,nea exterior de la 5(ape !ue corresponde al texto # luego llamando a (it
o contains con esa 5(ape" El soporte de edici%n de texto re!uiere una compro&aci%n
muc(o ms sofisticada" 5i !ueremos permitir !ue el usuario edite el texto generalmente
de&er,amos usar uno de los componentes de texto edita&le de 5Jing" 5i estamos
tra&ajando con texto primitivo # estamos usando 2ext-a#out para manejar la forma #
posici%n del texto tam&i'n podemos usar 2ext-a#out para realizar la compro&aci%n
para la edici%n de texto"
Ejemplo3 5(ape/over
Este applet permite al usuario arrastrar la 5(ape por la ventana del applet" -a 5(ape se
redi&uja en cada nueva posici%n del rat%n para proporcionar informaci%n al usuario
mientras la arrastra"
5e llama al m'todo contains para determinar si el cursor est dentro de los l,mites del
rectngulo cuando se pulsa el &ot%n" 5i es as, se actualiza la posici%n del rectngulo"
pu&lic void mousePressed(/ouseEvent e)Q
lastNx R rect"x * e"getO()<
lastN# R rect"# * e"getH()<
if(rect"contains(e"getO() e"getH())) update-ocation(e)<
"""
pu&lic void update-ocation(/ouseEvent e)Q
rect"set-ocation(lastNx T e"getO() lastN# T e"getH())<
"""
repaint()<
Al redi&ujar la 5(ape en cada posici%n del rat%n es mu# lento por!ue el rectngulo
relleno es renderizado cada vez !ue se mueve 0sando el do&le &uffer podemos eliminar
este pro&lema" 5i estamos usando 5Jing el di&ujo usar do&le &uffer automticamente<
si no es as, tendremos !ue cam&iar todo el c%digo de renderizado"
5i no estamos usando 5Jing el Ejemplo3 Euffered5(ape/over en la siguiente lecci%n
nos muestra c%mo podemos implementar el do&le &uffer usando un EufferedImage"
Podemos di&ujar en un EufferedImage # luego copiar la imagen en la pantalla"
Ejemplo3 Dit2est5ample
Esta aplicaci%n ilustra la compro&aci%n de pulsaciones di&ujando el cursor por defecto
siempre !ue el usuario pulse so&re el 2ext-a#out como se muestra en la siguiente
figura"
Esta es una imagen del 40I del applet" Para ajecutar el applet pulsa so&re ella" El
applet aparecer en una nueva ventana del navegador"
Dit2est5ample"java contiene el c%digo completo de este applet"
El m'todo mouse8licGed usa 2ext-a#out"(it2est8(ar para devolver un o&jeto
java"aJt"font"2extDitInfo !ue contiene la posici%n del clicG (el ,ndice de inserci%n) en
el o&jeto 2ext-a#out"
-a informaci%n devuelta por los m'todos de 2ext-a#out getAscent getDescent #
getAdvance se utiliza para calcular la posici%n del origen del o&jeto 2ext-a#out para
!ue est' centrado tanto (orizontal como verticalmente"
"""
private Point2D compute-a#outKrigin() Q
Dimension size R getPreferred5ize()<
Point2D"$loat origin R neJ Point2D"$loat()<
origin"x R (float) (size"Jidt( * text-a#out"getAdvance()) I 2<
origin"# R
(float) (size"(eig(t * text-a#out"getDescent()
T text-a#out"getAscent())I2<
return origin<
S
"""
pu&lic void paint8omponent(4rap(ics g) Q
super"paint8omponent(g)<
setEacGground(8olor"J(ite)<
4rap(ics2D grap(ics2D R (4rap(ics2D) g<
Point2D origin R compute-a#outKrigin()<
grap(ics2D"translate(origin"getO() origin"getH())<
II DraJ text-a#out"
text-a#out"draJ(grap(ics2D = =)<
II .etrieve caret 5(apes for insertionIndex"
5(ape9: carets R text-a#out"get8aret5(apes(insertionIndex)<
II DraJ t(e carets" carets9=: is t(e strong caret and
II carets9?: is t(e JeaG caret"
grap(ics2D"set8olor(52.K64N8A.E2N8K-K.)<
grap(ics2D"draJ(carets9=:)<
if (carets9?: UR null) Q
grap(ics2D"set8olor(1EAMN8A.E2N8K-K.)<
grap(ics2D"draJ(carets9?:)<
S
S
"""
private class Dit2est/ouse-istener extends /ouseAdapter Q
IVV
V 8ompute t(e c(aracter position of t(e mouse clicG"
VI
pu&lic void mouse8licGed(/ouseEvent e) Q
Point2D origin R compute-a#outKrigin()<
II 8ompute t(e mouse clicG location relative to
II text-a#outPs origin"
float clicGO R (float) (e"getO() * origin"getO())<
float clicGH R (float) (e"getH() * origin"getH())<
II 4et t(e c(aracter position of t(e mouse clicG"
2extDitInfo currentDit R text-a#out"(it2est8(ar(clicGO clicGH)<
insertionIndex R currentDit"getInsertionIndex()<
II .epaint t(e 8omponent so t(e neJ caret(s) Jill &e displa#ed"
(itPane"repaint()<
S
R)5o(0+( 8+ R)2&E3 d) D&'7-o
8ual!uier 5(ape puede usarse como un pat( de recortado !ue restringe las porciones del
rea de di&ujo !ue sern renderizadas" El pat( de recortado forma parte del contexto
4rap(ics2D< para seleccionar el atri&uto clip se llama a 4rap(ics2D"set8lip # se pasa a
la 5(ape !ue define el pat( de recortado !ue !ueramos usar" Podemos reducir el pat( de
recortado llamando al m'todo clip # pasndolo en otra 5(ape< el atri&uto clip se
configura a la intersecci%n entre el clip actual # el 5(ape especificado"
Ejemplo3 8lipImage
Este ejemplo anima un pat( de recortado para revelar diferentes porciones de una
imagen3
"
El pat( de recortado est definido por la intersecci%n de una elipse # un rectngulo
cu#as dimensiones son aleatorias" -a elipse se pasa al m'todo set8lip # luego se llama
al m'todo clip para seleccionar el pat( de recortado a la intersecci%n entre la elipse # el
rectngulo"
private Ellipse2D ellipse R neJ Ellipse2D"$loat()<
private .ectangle2D rect R neJ .ectangle2D"$loat()<
"""
ellipse"set$rame(x # eJ e()<
g2"set8lip(ellipse)<
rect"set.ect(xT> #T> eJ*?= e(*?=)<
g2"clip(rect)<
Ejemplo3 5tarr#
0n rea de recortado tam&i'n puede crearse desde una cadena de texto existente" El
siguiente ejemplo crea un 2ext-a#out con la cadena 2(e 5tarr# 6ig(t" -uego o&tiene
una l,nea exterior del 2ext-a#out" El m'todo 2ext-a#out"getKutline devuelve un o&jeto
5(ape # un .ectangle creado a partir de los l,mites del o&jeto 5(ape" -os l,mites
contienen todos los pixels !ue la#out puede di&ujar" El color en el contexto grfico se
selecciona a azul # se di&uja la figura exterior de la forma como ilustran la siguiente
imagen # el fragmento de c%digo"
$ont.ender8ontext frc R g2"get$ont.ender8ontext()<
$ont f R neJ $ont(+Delvetica+ ? JI?=)<
5tring s R neJ 5tring(+2(e 5tarr# 6ig(t+)<
2ext-a#out tl R neJ 2ext-a#out(s f frc)<
Affine2ransform transform R neJ Affine2ransform()<
5(ape outline R text2l"getKutline(null)<
.ectangle r R outline"getEounds()<
transform R g2"get2ransform()<
transform"translate(JI2*(r"Jidt(I2) (I2T(r"(eig(tI2))<
g2"transform(transform)<
g2"set8olor(8olor"&lue)<
g2"draJ(outline)<
-uego se selecciona un rea de recortado en el contexto grfico usando el o&jeto 5(ape
creado a partir de getKutline" -a imagen starr#"gif !ue es una pintura famosa de Fan
4og( 2(e 5tarr# 6ig(t se di&uja dentro de rea de recortado !ue empieza en la
es!uina inferior iz!uierda del o&jeto .ectangle"
g2"set8lip(outline)<
g2"draJImage(img r"x r"# r"Jidt( r"(eig(t t(is)<
P730)+do < R)88)3o d) G(C4&5o6 P(&1&0&.o6
8am&iando el punteado # los atri&utos de di&ujo en el contexto de 4rap(ics2D antes
del di&ujo podemos fcilmente aplicar estilos divertidos de l,neas # patrones de relleno
para grficos primitivos" Por ejemplo podemos di&ujar una l,nea punteada creando el
o&jeto 5troGe apropiado # llamando a set5troGe para a7adirlo al contexto 4rap(ics2D
antes de di&ujar la l,nea" De forma similar podemos aplicar un relleno de gradiente a un
5(ape creando un o&jeto 4radientPaint # a7adiendo al contexto 4rap(ics2D llamando a
setPaint antes de di&ujar la 5(ape"
El siguiente applet demuestra c%mo podemos di&ujar formas geom'tricas usando los
m'todos 4rap(ics2D draJ # fill"
Esta es una imagen del 40I del applet" Para ajecutar el applet pulsa so&re ella" El
applet aparecer en una nueva ventana del navegador"
5(apesDemo2D"java contiene el c%digo completo de este applet"
8ada una de las formas di&ujadas por el applet est construida de geometr,as # est
di&ujada a trav's de 4rap(ics2D" -as varia&les rectDeig(t # rect1idt( de este ejemplo
definen las dimensiones del espacio en !ue se di&uja cada forma en pixels" -a varia&les
x e # cam&ian para cada forma para !ue sean di&ujadas en formaci%n de parrilla"
II draJ -ine2D"Dou&le
g2"draJ(neJ -ine2D"Dou&le(x #TrectDeig(t*?
x T rect1idt( #))<
II draJ .ectangle2D"Dou&le
g2"set5troGe(stroGe)<
g2"draJ(neJ .ectangle2D"Dou&le(x #
rect1idt(
rectDeig(t))<
II draJ .ound.ectangle2D"Dou&le
g2"set5troGe(das(ed)<
g2"draJ(neJ .ound.ectangle2D"Dou&le(x #
rect1idt(
rectDeig(t
?= ?=))<
II draJ Arc2D"Dou&le
g2"set5troGe(Jide5troGe)<
g2"draJ(neJ Arc2D"Dou&le(x #
rect1idt(
rectDeig(t
W= ?;>
Arc2D"KPE6))<
II draJ Ellipse2D"Dou&le
g2"set5troGe(stroGe)<
g2"draJ(neJ Ellipse2D"Dou&le(x #
rect1idt(
rectDeig(t))<
II draJ 4eneralPat( (pol#gon)
int x?Points9: R Qx xTrect1idt(
x xTrect1idt(S<
int #?Points9: R Q# #TrectDeig(t
#TrectDeig(t #S<
4eneralPat( pol#gon R neJ
4eneralPat((4eneralPat("1I6DNEFE6NKDD
x?Points"lengt()<
pol#gon"move2o(x?Points9=: #?Points9=:)<
for (int index R ?<
index X x?Points"lengt(<
indexTT) Q
pol#gon"line2o(x?Points9index:
#?Points9index:)<
S<
pol#gon"closePat(()<
g2"draJ(pol#gon)<
II draJ 4eneralPat( (pol#line)
int x2Points9: R Qx xTrect1idt( x
xTrect1idt(S<
int #2Points9: R Q# #TrectDeig(t
#TrectDeig(t #S<
4eneralPat( pol#line R neJ
4eneralPat((4eneralPat("1I6DNEFE6NKDD
x2Points"lengt()<
pol#line"move2o (x2Points9=: #2Points9=:)<
for (int index R ?<
index X x2Points"lengt(<
indexTT) Q
pol#line"line2o(x2Points9index:
#2Points9index:)<
S<
g2"draJ(pol#line)<
II fill .ectangle2D"Dou&le (red)
g2"setPaint(red)<
g2"fill(neJ .ectangle2D"Dou&le(x #
rect1idt( rectDeig(t))<
II fill .ound.ectangle2D"Dou&le
g2"setPaint(redtoJ(ite)<
g2"fill(neJ .ound.ectangle2D"Dou&le(x #
rect1idt(
rectDeig(t
?= ?=))<
II fill Arc2D
g2"setPaint(red)<
g2"fill(neJ Arc2D"Dou&le(x # rect1idt(
rectDeig(t W=
?;> Arc2D"KPE6))<
II fill Ellipse2D"Dou&le
g2"setPaint(redtoJ(ite)<
g2"fill (neJ Ellipse2D"Dou&le(x #
rect1idt(
rectDeig(t))<
II fill and stroGe 4eneralPat(
int x;Points9: R Qx xTrect1idt( x
xTrect1idt(S<
int #;Points9: R Q# #TrectDeig(t
#TrectDeig(t #S<
4eneralPat( filledPol#gon R neJ
4eneralPat((4eneralPat("1I6DNEFE6NKDD
x;Points"lengt()<
filledPol#gon"move2o(x;Points9=:
#;Points9=:)<
for (int index R ?<
index X x;Points"lengt(<
indexTT) Q
filledPol#gon"line2o(x;Points9index:
#;Points9index:)<
S<
filledPol#gon"closePat(()<
g2"setPaint(red)<
g2"fill(filledPol#gon)<
K&serva !ue este ejemplo usa implementaciones de do&le precision de las clases
geom'tricas" Donde sea posi&le las implementaciones de los float # do&le precisi%n de
cada geom'trico estn proporcionados por clases internas"
Di&ujar 8urvas
-os applets 8u&ic # Luad demuestran como crear curvas c)&icas # cuadrticas usando
8u&ic8urve2D # Luad8urve2D" Estos applets tam&i'n demuestran como se di&ujan las
curvas con respecto al posicionamiento de los puntos de control permitiendonos mover
interactivamente tanto los puntos de control como los puntos finales"
Ejemplo3 Luad
El applet Luad demuestra una curva cuadrtica !ue es un segmento de curva !ue tiene
dos puntos finales # un )nico punto de control" El punto de control determina la forma
de la curva controlando tanto el punto de control como los vectores tangenciales de los
puntos finales"
Esta es una imagen del 40I del applet" Para ajecutar el applet pulsa so&re ella" El
applet aparecer en una nueva ventana del navegador"
Luad"java contiene el c%digo completo de este applet"
Primero se crea una nueva curva cuadrtica con dos puntos finales # un punto de control
# las posiciones de los puntos se seleccionan con respecto al tama7o de la ventana"
Luad8urve2D"Dou&le !uad R neJ Luad8urve2D"Dou&le()<
Point2D"Dou&le start end control<
start R neJ Point2D"Dou&le()<
one R neJ Point2D"Dou&le()<
control R neJ Point2D"Dou&le()<
!uad"set8urve(start one control)<
start"set-ocation(JI2*>= (I2)<
end"set-ocation(JI2T>= (I2)<
control"set-ocation((int)(start"x)T>= (int)(start"#)*>=)<
8ada vez !ue el usuario mueva uno de los puntos la curva se resetear"
!uad"set8urve(start control end)<
Ejemplo3 8u&ic
El ejemplo 8u&ic muestra una curva c)&ica !ue es un segmento de curva !ue tiene dos
puntos finales # dos puntos de control" 8ada punto de control determina la forma de la
curva mediante el control de uno de los vectores tangenciales de un punto final" En el
ejemplo 8u&ic las cruces coloreadas se di&ujan donde se encuentran los puntos de
control # los puntos finales" El punto de control azul controla el punto final rojo # el
punto de control verde controla el punto final magenta"
Esta es una imagen del 40I del applet" Para ajecutar el applet pulsa so&re ella" El
applet aparecer en una nueva ventana del navegador"
8u&ic"java contiene el c%digo completo de este applet"
0na curva c)&ica se crea con dos puntos finales # dos puntos de control # las
localizaciones de los puntos se seleccionan con respecto al tama7o de la ventana"
8u&ic8urve2D"Dou&le cu&ic R neJ 8u&ic8urve2D"Dou&le()<
Point2D"Dou&le start end one tJo<
start R neJ Point2D"Dou&le()<
one R neJ Point2D"Dou&le()<
tJo R neJ Point2D"Dou&le()<
end R neJ Point2D"Dou&le()<
cu&ic"set8urve(start one tJo end)<
"""
start"set-ocation(JI2*>= (I2)<
end"set-ocation(JI2T>= (I2)<
one"set-ocation((int)(start"x)T2> (int)(start"#)*2>)<
tJo"set-ocation((int)(end"x)*2> (int)(end"#)T2>)<
8omo en el ejemplo Luad la curva es reseteada cada vez !ue se mueven los puntos"
cu&ic"set8urve(start one tJo end)<
Di&ujar formas ar&itrarias
El ejemplo 5(apesDemo usa 4eneralPat( para (acer pol,gonos en forma de cristales
pero tam&ien podemos usar 4eneralPat( para (acer formas ar&itrarias tanto con l,neas
rectas como curvas"
Ejemplo3 KddN5(ape
El ejemplo KddN5(ape usa 4eneralPat( para crear formas ar&itrarias en la secci%n
$ormas"
Esta es una imagen del 40I del applet" Para ajecutar el applet pulsa so&re ella" El
applet aparecer en una nueva ventana del navegador"
KddN5(ape"java contiene el c%digo completo de este applet"
El siguiente c%digo crea un nuevo 4eneralPat( # a7ade el primer punto al pat("
4eneralPat( odd5(ape R neJ 4eneralPat(()<
"""
x R JI2 T >=<
# R (I2 * 2><
x2 R x<
#2 R #<
odd5(ape"move2o(x #)<
Despu's de a7adir el primer punto al pat( se a7aden tres l,neas rectas"
x *R ?==<
odd5(ape"line2o(x #)<
# TR >=<
odd5(ape"line2o(x #)<
x TR ?==<
odd5(ape"line2o(x #)<
$inalmente se a7ade una curva c)&ica"
x TR ?=<
# *R ?=<
x? R x * 2=<
#? R # * 2=<
odd5(ape"curve2o(x # x? #? x2 #2)<
Definir Estilos de l,nea divertidos # Patrones de relleno"
Pro&a&lemente (a&rs o&servado en el ejemplo anterior algunas de las formas tienen
l,neas punteadas o estn rellenas con gradientes de dos colores" 0sando las clases 5troGe
# Paint de Java 2D podemos fcilmente definir estilos de l,nea divertidos # patrones de
relleno"
Estilos de -,nea
-os estilos de l,nea estn definidos por el atri&uto stroGe en el contexto 4rap(ics2D"
Para seleccionar el atri&uto stroGe podemos crear un o&jeto Easic5troGe # pasarlo
dentro del m'todo 4rap(ics2D set5troGe"
0n o&jeto Easic5troGe contiene informaci%n so&re la anc(ura de la l,nea estilo de
uniones estilos finales # estilo de punteado" Esta informaci%n se usa cuando se di&uja
un 5(ape con el m'todo draJ"
-a anc(ura de l,nea es la longitud de la l,nea medida perpendicularmente a su
tra#ectoria" -a anc(ura de la l,nea se especificada como un valor float en las unidades
de coordenadas de usuario !ue es e!uivalente a ?IB2 pulgadas cuando se utiliza la
transformaci%n por defecto"
El estilo de uni%n es la decoraci%n !ue se aplica cuando se encuentran dos segmentos de
l,nea" Easic5troGe soporta tres estilos de uni%n3"
JKI6NEEFE-
JKI6N/I2E.
JKI6N.K06D
El estilo de finales es la decoraci%n !ue se aplica cuando un segmento de l,nea termina"
Easic5troGe soporta tres estilos de finalizaci%n3
8APNE022
8APN.K06D
8APN5L0A.E
El estilo de punteado define el patr%n de las secciones opacas # transparentes aplicadas
a lo largo de la longitud de la l,nea" Este estilo est definido por un arra# de punteado #
una fase de punteado" El arra# de punteado define el patr%n de punteado" -os elementos
alternativos en el arra# representan la longitud del punteado # el espacio entre
punteados en unidades de coordenadas de usuario"" El elemento = representa el primer
punteado el elemento ? el primer espacio etc" -a fase de punteado es un
desplazamiento en el patr%n de punteado tam&i'n especificado en unidades de
coordenadas de usuario" -a fase de punteado indica !ue parte del patr%n de punteado se
aplica al principio de la l,nea"
Patr%n de .elleno
-os patrones de rellenos estn definidos por el atri&uto paint en el contexto 4rap(ics2D"
Para seleccionar el atri&uto paint se crea un ejemplar de un o&jeto !ue implemente el
interface Paint # se pasa dentro del m'todo 4rap(ics2D setPaint"
2res clases implementan el interface Paint3 8olor 4radientPaint # 2exturePaint "
4radientPaint # 2exturePaint son nuevas en el JDM ?"2"
Para crear un 4radientPaint se especifica una posici%n inicial # un color # una posici%n
final # otro color" El gradiente cam&ia proporcionalmente desde un color al otro a lo
largo de la l,nea !ue conecta las dos posiciones"
El patr%n para una 2exturePaint esta definido por un EufferedImage" Para crear un
2exturePaint se especifica una imagen !ue contiene el patr%n # un rectngulo !ue se
usa para replicar # anclar el patr%n"
Ejemplo3 5troGeAnd$ill
El applet 5troGeAnd$ill permite al usuario seleccionar un grfico primitivo un estilo de
l,nea un estilo de di&ujo # o &ien puntear el exterior del o&jeto rellenarlo con el di&ujo
seleccionado o puntear el o&jeto en &lanco # rellenar el di&ujo con el di&ujo
seleccionado"
Esta es una imagen del 40I del applet" Para ajecutar el applet pulsa so&re ella" El
applet aparecer en una nueva ventana del navegador"
5troGeAnd$ill"java contiene el c%digo completo de este applet"
-os primitivos son inicializados e introducidos en un arra# de o&jetos 5(ape" El
siguiente c%digo crea un .ectangle # un Ellipse2D"Dou&le # los introduce en el arra#
s(apes"
s(apes9=: R neJ .ectangle(= = ?== ?==)<
s(apes9?: R neJ Ellipse2D"Dou&le(="= ="= ?=="= ?=="=)<
Para crear un o&jeto 5(ape desde una cadena de texto primero de&emos crear un o&jeto
2ext-a#out desde el texto de la cadena"
2ext-a#out text2l R neJ 2ext-a#out(+2ext+
neJ $ont(+Delvetica+ ? W@)
neJ $ont.ender8ontext(null false false))<
-as siguientes l,neas transforman el 2ext-a#out para !ue sea centrado en el origen #
luego introduce el o&jeto 5(ape resultante de la llamda a getKutline dentro del arra#
s(apes"
Affine2ransform textAt R neJ Affine2ransform()<
textAt"translate(=
(float)text2l"getEounds()"getDeig(t())<
s(apes92: R text2l"getKutline(textAt)<
Podemos elegir un primitivo accediendo al ,ndice apropiado dentro del arra# s(apes"
5(ape s(ape R
s(apes92ransform"primitive"get5electedIndex():<
8%mo se realiza el di&ujo dependen de las opciones elegidas"

8uando el usuario elige stroGe se llama a 4rap(ics2D"draJ para realizar el


di&ujo 5i se elige text como primitivo las l,neas son recuperadas # el di&ujo se
(ace con el m'todo draJ"

8uando el usuario elige fill se llama a 4rap(ics2D"fill o 4rap(ics2D"draJ5tring


para realizar el di&ujado"

8uando el usuario elige stroGe and fill se llama a fill o draJ5tring para rellenar
el 5(ape # luego se llama a draJ para di&ujar la l,nea exterior"
6ota3
Para rellenar # puntear un grfico primitivo necesitamos (acer dos llamadas separadas a
m'todos3 fill o draJ5tring para rellenar el interior # draJ para di&ujar el exterior"
-os tres estilos de l,nea usados en este ejemplo ** anc(o estrec(o # punteado ** son
ejemplares de Easic5troGe"
II 5ets t(e 5troGe"
"""
case = 3 g2"set5troGe(neJ Easic5troGe(;"=f))< &reaG<
case ? 3 g2"set5troGe(neJ Easic5troGe(C"=f))< &reaG<
case 2 3 float das(9: R Q?="=fS<
g2"set5troGe(neJ Easic5troGe(;"=f
Easic5troGe"8APNE022
Easic5troGe"JKI6N/I2E.
?="=f das( ="=f))<
&reaG<
El estilo de punteado de este ejemplo tiene ?= unidades de punteado alternados con ?=
unidades de espacio" El principio del patr%n del punteado se aplica al principio de la
l,nea ** la fase de punteado es ="="
En este ejemplo se usan tres estilos de di&ujo ** s%lido gradiente # polGa" El di&ujo de
color s%lido es un ejemplar de 8olor el gradiente un ejemplar de 4radientPaint # el
patr%n un ejemplar de 2exturePaint"
II 5ets t(e Paint"
"""
case = 3 g2"setPaint(8olor"&lue)< &reaG<
case ? 3 g2"setPaint(neJ 4radientPaint(= =
8olor"lig(t4ra#
J*2>= ( 8olor"&lue false))<
&reaG<
case 2 3 EufferedImage &i R neJ EufferedImage(> >
EufferedImage"2HPENI62N.4E)<
4rap(ics2D &ig R &i"create4rap(ics()<
&ig"set8olor(8olor"&lue)<
&ig"fill.ect(= = > >)<
&ig"set8olor(8olor"lig(t4ra#)<
&ig"fillKval(= = > >)<
.ectangle r R neJ .ectangle(==>>)<
g2"setPaint(neJ 2exturePaint(&i r))<
&reaG<
OPERADORES ARIT#ETICOS:

El soporte de JAI es provisto de operadores aritm'ticos monadic # didicos" En el
monadic los funcionamientos aritm'ticos inclu#en suma del por cada &anda
su&stracci%n multiplicaci%n # divisi%n entre una imagen de la fuente # un valor
constante !ue produce la imagen de destino"
-os funcionamientos aritm'ticos didicos inclu#en suma del por cada &anda
su&stracci%n multiplicaci%n # divisi%n entre dos imgenes fuente para producir una
imagen de destino" 2am&i'n es posi&le tomar el valor a&soluto de pixeles en la imagen
de la fuente # guardar los resultados en una imagen de destino" Exponenciacion
tam&i'n se proporciona"

-as operaciones aritm'ticas re!uieren !ue las imgenes fuente # la imagen del destino
tengan los mismos tipos de datos # n)mero de &andas" El tama7o de las dos imgenes
(altura # anc(ura) sin em&argo no necesita ser el mismo"

8uando las operaciones son realizadas se alinean situaciones del origen para cada
imagen o la sola imagen para las operaciones del monadic" Por ejemplo para la suma de
la imagen el valor a situaci%n == en uno la imagen de la fuente se agrega a situaci%n ==
de la segunda imagen de la fuente # el resultado se guarda en situaci%n == de la imagen
del destino" Este procedimiento se repite para cada p,xel" -as operaciones aritm'ticas
para imgenes onmulti*&anda son realizadas con respecto a la &anda de la imagen
fuente"

5e usan las operaciones aritm'ticas para realizar una com&inaci%n p,xel a p,xel de dos
imgenes o de una imagen con un valor constante
CO#PUESTO:
El JAI del funcionamiento compuesto re!uiere seis parmetros" Dos imgenes de la
fuente dos imgenes del alfa (segundo uno puede ser nulo) una &andera del &oolean
!ue indica si o no el alfa se (a multiplicado a fuentes # destino # una &andera del
+alp(a$irst+ d%nde verdadero indica !ue el cauce del alfa es la primera &anda de la
imagen del destino"

Por ejemplo


p& R neJ ParameterElocG()
p&"add5ource(source?)<
p&"add5ource(source2)<
p&"add(alp(a?)<
p&"add(null)<
p&"add(neJ Eoolean(false))<
destination R JAI"create(+composite+ p& null)<

El funcionamiento compuesto com&ina dos imgenes &asadas en sus valores del alfa a
cada p,xel" Esto se (ace en una &ase por cada &anda # se espera !ue las dos imgenes
de la fuente tengan el mismo n)mero de &andas # el mismo tipo de datos" -a imagen
del destino tiene los mismos tipos de datos de las dos imgenes de la fuente pero con
una &anda extra !ue representa el cauce de alfa resultante"

-os valores de p,xel de destino pueden verse como una representaci%n fraccional de
cada pixel o como un factor de transparencia" especifica los instrumentos compuestos el
Porter*Duff +encima de+ la regla en !ue el color del rendimiento de un pixel con el
triple de valorIalp(a de fuente (A a) # (E &) se da por el aVA T (? * a)V(&VE)" El valor
de alfa de rendimiento se da por a T (? * a)V&" Para el triple de fuentes de
premultiplicado ( aVA a) # ( &VE &) el valor de rendimiento de premultiplicado
simplemente es ( aVA) T (? * a)V(&VE)"

-os canales de color de las dos imgenes fuente son provistos v,a source? # source2"
-as dos fuentes de&en ser cual!uiera los dos pre*multiplicados por el alfa o no" El cauce
del alfa no de&e ser incluido en el source? # source2"

El canal del alfa de las primeras imgenes de la fuente de&e proporcionarse v,a
parmetro del source?Alp(a" Este parmetro no puede ser nulo" El canal del alfa de la
segunda imagen fuente puede proporcionarse v,a parmetro del source2Alp(a" Este
parmetro puede ser nulo en el caso en !ue la segunda fuente es considerada
completamente opaca" -as imgenes del alfa de&en solo*atarse # tiene los mismos
tipos de datos as, como las dimensiones de sus imgenes fuente correspondientes"

El parmetro del alp(aPremultiplied indica si o no la imagen del alfa proporcionada es
el premultiplied a am&as imgenes fuente" 2am&i'n indica si la imagen destino los
canales de color tienen los valores del alfa multiplicados a los valores de color de pixel"

-a imagen del destino es la com&inaci%n de las dos imgenes de la fuente" 2iene los
canales de color # un canal del alfa adicional (el ,ndice de la &anda depende del
parmetro del alp(a$irst)" 5i el valor del alfa tam&i'n se pre*multiplica a los canales de
color este tam&i'n depende del valor de alp(aPremultiplied (pre*multiplic% si
verdadero)"
CONVOLUCION:

El pseudocodigo para el funcionamiento de la convoluci%n en un ejemplo singular
dst9x:9#: es como sigue asumiendo el o&jeto es de tama7o anc(ura x altura # se (a
girado a trav's de ?C= grados" El elemento del Krigen del o&jeto se localiza a la
posici%n (xKrigin #Krigin)3

dst9x:9#: R =<
for( int i R * xKrigin< i X* xKrigin T Jeig(t< iTT) Q
for ( int j R * #Krigin< j X* #Krigin T (ieg(t < jTT) Q
dst9x:9#: T R src9xTi:9#Tj: V Gernel9xKriginTi:9#KriginTj:<
S
S


-a convoluci%n deja una &anda de pixeles alrededor de los &ordes indefinido" Por
ejemplo para un o&jeto ;x; s%lo cuatro elementos del o&jeto # cuatro pixeles de la
fuente contri&u#en al pixel de la convoluci%n en las es!uinas de la imagen de la fuente"
Pixeles !ue no permiten aplicar el o&jeto lleno a la fuente no son incluidos en la imagen
del destino" 0n funcionamiento $ronterizo puede usarse para agregar una frontera
apropiada a la imagen de la fuente para evitar encogimiento de los l,mites de la imagen"
El o&jeto no puede ser ms grande en cual!uier dimensi%n !ue los datos de la imagen"

0n Mernel se caracteriza por su anc(ura altura # origen o el elemento importante" El
elemento importante es el elemento !ue se pone encima del pixel de la fuente actual
para realizar convoluci%n o difusi%n del error" En el caso de tem&lar pedir una serie de
o&jetos de Mernel se re!uiere realmente !ue sea un Mernel por la &anda de la imagen
cam&iada" Para cam&iar se pide la situaci%n del elemento importante !ue de (ec(o no
pertinente"

-a 5o3.o875&E3 es un funcionamiento espacial !ue computa cada muestra del
rendimiento multiplicando elementos de un grano con las muestras !ue rodean una
muestra de la fuente particular"

Para cada muestra del destino el o&jeto se gira ?C= grados # su elemento+ importante u
origen se pone encima del pixel de la fuente !ue corresponde con el pixel del destino"
-os elementos del grano se multiplican con los pixeles de la fuente &ajo ellos # los
productos resultantes se suman para producir el valor de muestra de destino"
=ISTOGRA#A:
-as tareas primarias necesitadas para o&tener un (istograma son como sigue3

?" cree un o&jeto del Distograma !ue especifica el tipo de (istograma a ser generado"

2" cree un funcionamiento del Distograma con los parmetros re!ueridos o crea un
ParameterElocG con los parmetros # pselo al funcionamiento del Distograma"

;" lea los datos del (istograma guardados en el o&jeto"

0n (istograma proporciona una vista del perfil de intensidad de una imagen
&sicamente # normalmente se despliega como un mapa de la &arra" -os valores del
pixel son ordenadas # contados con la suma para cada intensidad puesta en su propia
caja" -as intensidades del pixel se trazan a lo largo del x*eje (orizontal mientras el
n)mero de ocurrencias para cada intensidad se traza a lo largo del #*eje vertical" El
(istograma puede considerarse como la estimaci%n de las pro&a&ilidades !ue un nivel de
intensidad particular ocurrira"

Para una imagen de C &its (a# 2>> posi&les valores de intensidad" As, dada una
imagen de C &its !ue es ?2C por ?2C con los valores todo el juego para poner a cero el
(istograma resultante a una sola &anda tendr,a un solo valor a las = con un valor de
?@;CA con todas las otras cajas !ue contienen el valor de =" -a suma de todos los
resultados en cada caja de&e tener magnitud para el n)mero total de pixeles en la
imagen"
CAPAS:
En JAI las colecciones contienen imgenes del rendera&le o colecciones !ue inclu#en
colecciones de imgenes" Pilas de imagen pirmides o mapas mip por ejemplo"

El funcionamiento de Add8ollection usado en esta demostraci%n toma una colecci%n de
imgenes dadas # agrega cada juego de pixeles uno de cada imagen de la fuente de la
posici%n correspondiente # &anda" Desde !ue los funcionamientos de la colecci%n se
realizan en conjunto los funcionamientos individuales de las imgenes re!uieren
extracci%n reinserci%n de la imagen"

-a clase de la colecci%n es principalmente un mecanismo usado para grupos de
imgenes donde un funcionamiento es igualmente aplicado al grupo entero"
LOOKUT TABLE:
El funcionamiento de -ooGup toma una imagen dada o renderada imagen # una mesa
del looGup # realiza el looGup de la mesa general pasando la imagen de la fuente a
trav's de la mesa"

-a imagen fuente puede ser mono o multi*&anda de tipos de datos us(ort s(ort o int"
El looGupta&le puede ser mono o multi*&anda # de cual!uier JAI soportando los tipos
de los datos" -a imagen destino de&e tener los mismos tipos de datos como la mesa del
looGup # su n)mero de &andas es determinado &asado en el n)mero de &andas de la
fuente # la mesa" 5i la fuente se mono*&anda el destino tiene el mismo n)mero de
&andas como la mesa del looGup< por otra parte el destino tiene el mismo n)mero de
&andas como la fuente"

5i la fuente = del ta&le es mono*&anda # el otro es multi*&anda entonces la mono &anda
se aplica a cada &anda del o&jeto multi*&anda" 5i los dos son multi*&anda entonces sus
&andas correspondiendo se aparean"

El ta&le puede tener un juego de valores del desplazamiento uno para cada &anda" Este
valor se su&strae del pixel de la fuente valorada antes de poner en un ,ndice en la serie
de datos del ta&le"

Es la responsa&ilidad del usuario (acer cierto el looGupta&le proporcionado
conveniente para la imagen fuente" Espec,ficamente los datos del ta&le cu&re el rango
entero de los datos de la fuente" Por otra parte el resultado de este funcionamiento es
indefinido"

Por la naturaleza de este funcionamiento el destino puede tener un n)mero diferente de
&andas #Io tipos de datos de la fuente" El 5ample/odel del destino se crea de acuerdo
con el looGupta&le real usada en un caso espec,fico"

-os valores de pixel de destino se definen por el pseudocodigo3

5i la imagen de la fuente se mono*&anda # el looGupta&le es mono o multi*&anda
entonces la imagen del destino tiene el mismo n)mero de &andas como el looGupta&le3

dst9x:9#:9&: R ta&le9&:9src9x:9#:9=: * offsets9&::

5i la imagen de la fuente es multi*&anda # el looGupta&le es mono*&anda entonces la
imagen del destino tiene el mismo n)mero de &andas como la imagen de la fuente3

dst9x:9#:9&: R ta&le9=:9src9x:9#:9&: * offsets9=::

5i la imagen de la fuente es multi*&anda # el looGupta&le es multi*&anda entonces con
el mismo n)mero de &andas como la imagen fuente la imagen destino tendr el mismo
n)mero de &andas como la imagen fuente3

dst9x:9#:9&: R ta&le9&:9src9x:9#:9&: * offsets9&::

-a modificaci%n del looGupta&le proporciona una transformaci%n de amplitud non*
lineal" -a 6on*liniear amplitud transformaci%n es )til para una variedad de efectos" El
&rillo contraste correcci%n gamma color pseudo # reducci%n colorida son unos
ejemplos de aplicaciones de looGupta&le" El valor del pixel de la imagen esta
diseccionado dentro del looGupta&le" El valor del pixel se reemplaza por los vol)menes
a esa direcci%n"
RENDEREABLE:
Esta demostraci%n utiliza el JAI"create.endera&le () JAI"create5caled.endering ()
m'todos para realizar la &alanza # funcionamientos de imaging de invertido"

El funcionamiento del Invertido invierte los valores del pixel de una imagen" Para las
imgenes de la fuente con los tipos de datos firmados el valor de pixel de la imagen
destino se define por el pseudocodigo3
dst9x:9#:9&: R * src9x:9#:9&:
Para los tipos de los datos sin firmar los valores del destino se definen por3

dst9x:9#:9&: R /AONFA-0E * src9x:9#:9&:
donde /AONFA-0E es el valor mximo apo#ado por el sistema del tipo de los datos
del pixel de la fuente"

-a ar!uitectura de API de rendera&le integra un modelo de independencia con un
paralelo dispositivo*dependiente (dado) modelo" -a porci%n dar*independiente de la
ar!uitectura es un superset del modelo tradicional de imaging dispositivo*dependiente"

-a capa del rendera&le proporciona fuentes de la imagen !ue pueden reusarse m)ltiples
veces en los contextos diferentes como la pantalla despliegue o imprimiendo" -os
operadores del rendera&le toman los parmetros dar*independientes # pueden
encadenarse juntos (el funcionamiento encadena) a para dirigir*ac#clic*grap(s(DA45)"
8ual!uier clase !ue lleva a ca&o la interfaz de .endera&leImage es una fuente del
rendera&le # de&e adaptar a .ender8ontexts" -as imgenes de .endera&le son los
referenciados a trav's del usuario con los sistemas de la coordenada definidos
RENDERABLE SCALE:
-a operaci%n de escala traduce # redimensiona una imagen" Para cada pixel (x #) del
destino el valor de la fuente a la posici%n del su&pixel fraccionaria ((x * x2rans)Ix5cale
(# * #2rans)I#5cale) se constru#e por medio de un o&jeto de la Interpolaci%n # escrito al
destino"

8uando aplica a una escala un factor de escala scaleNx scaleN# a una imagen fuente
con la anc(ura de srcNJidt( # altura de srcN(eig(t la imagen resultante se define para
tener las dimensiones siguientes3


dstNJidt( R srcNJidt( V scaleNx
dstN(eig(t R srcN(eig(t V scaleN#


8uando se especifican interpolaciones !ue re!uieren la fuente al relleno como Eilinear o
interpolaci%n de Eicu&ic la fuente necesita ser extendida tal como los pixeles extras se
necesit% computar todos los pixeles del destino" Esta extensi%n es realizada v,a la clase
de EorderExtender" El tipo de Extensi%n $ronteriza puede especificarse como un
.enderingDint al m'todo de JAI"create"

5i ninguna Extensi%n $ronteriza se especifica la fuente no se extender" El tama7o de la
imagen escalada todav,a es calculado seg)n la f%rmula especificada anteriormente" 6o
(a# &astante fuente sin em&argo su&secuentemente para computar todos los pixeles del
destino s%lo ese su&conjunto de los pixeles de la imagen del destino !ue pueden
computarse se escri&ir en el destino" El resto del destino no se escri&ir"

Especificando un factor de escala ma#or a ? aumenta el tama7o de la imagen
especificando un factor de escala entre = # ? (non*inclusivo) las disminuciones el
tama7o de una imagen" 0n IllegalArgumentException se tirar si los factores de la
escala especificados son negativos o igual a cero"

-a &alanza define un Propert#4enerator !ue realiza una transformaci%n id'ntica en la
propiedad de +.KI+ de la imagen de la fuente !ue puede recuperarse llamando el
m'todo del getPropert# con +.KI+ como el nom&re de propiedad"

-as operaciones rendera&le de escala tiene en cuenta las imgenes de la multi*
resoluci%n para encontrar la imagen con el pr%ximo factor de escala ms grande" Esta
imagen se usa para escalar el tama7o del rendimiento deseado"
U#BRAL:
El funcionamiento del 0m&ral toma uno imagen dada # traza todos los pixeles de esta
imagen cu#o valor se !ueda dentro de un rango especificado a una constante
especificada" El rango se especifica por un valor &ajo # un valor alto"


5i el n)mero de elementos proporcionara v,a el +alto+ +&aja+ # las series de las
+constantes+ son menores del n)mero de &andas de la imagen de la fuente entonces el
elemento de entrada = se aplica a todas las &andas" Por otra parte el elemento de una
entrada diferente se aplica a su &anda correspondiendo"

2(res(olding tam&i'n conocido como la +mejora del contraste &inario+ proporciona un
medios simples de definir los l,mites de o&jetos !ue aparecen en un fondo contrastante"
El funcionamiento del um&ral traza todo el valor del pixel de una imagen !ue oto7o
dentro de un rango dado a uno de un juego de constantes del por*&anda"

El valor de pixel de la imagen del destino &#te define con el pseudocodigo siguiente3
if ( src9x:9#:9&: YR loJ9&: ZZ
src9x:9#:9&: XR (ig(9&: ) Q
dst9x:9#:9&: R constants9&:<
S else Q
dst9x:9#:9&: R src9x:9#:9&:<
S
FARP:

Para torcerse la imagen pueden seleccionarse juegos de puntos usando el &ot%n del
rat%n iz!uierdo" Por ejemplo para el affine apriete el &ot%n del rat%n # arrstrelo a una
nueva situaci%n" 0na l,nea de venda de cauc(o mostrar el camino" 8uando el rat%n se
suelta un par de puntos se mostrar conectado por una l,nea recta" .epita este dos ms
veces" 0n mensaje al fondo de la ventana contar el n)mero de juegos seleccionado"
Pueden arrastrarse los puntos a las nuevas situaciones o los puntos de sumas agregaron
!u' !uiere de nuevo tu'rzase la imagen"

Java Advanced Imaging proporciona una clase de la transformaci%n Jarp !ue se usa
para la transformaci%n de coordenada nolineal de imagen" El pixel posiciona en la clase
de la 0rdim&re se representa usando el fijo*punto coordina la exactitud del su&pixel
productiva pero todav,a permitiendo el uso de aritm'tica del entero" El grado de
precisi%n es fijo por las funciones de JAI apropiadas en el m'todo del Jarp.ect"

El m'todo importante de esta clase es Jarp.ect !ue proporciona las situaciones de los
pixeles en el espacio de la fuente !ue el mapa a una regi%n del rendimiento rectangular
dada" -a regi%n del rendimiento !ue usa las coordenadas del entero normales se
especifica" 5e especifican las posiciones de la fuente vueltas por el m'todo en el fijo*
punto las coordenadas del su&pixel"

Java Advanced Imaging apo#a C funciones de ala&eo3

Po8&3E1&5o
E8 :o8&3o1&o 2)3)(+8
L+ ()-+
C7+d(C0&5o
CG'&5o
E3 :)(6:)50&.+
A44&3)
O:I1+2)
/s all del affine transforma el imagen torcerse es un tipo de transformaci%n
geom'trica !ue introduce la curvatura en el proceso de la cartograf,a" -a introducci%n
de curvatura es importante cuando una imagen se (a torcido a trav's de las a&erraciones
de la lente # otros procesos non*lineales" 2am&i'n puede usarse para la registraci%n de
la imagen"

-as transformaciones torci'ndose tam&i'n conocido como las transformaciones de (oja
de cauc(o pueden estirar una imagen ar&itrariamente so&re los puntos definidos" Este
tipo de funcionamiento proporciona una transformaci%n del nonlinear entre la fuente #
coordenadas del destino"
ARBOL DE =ERENCIA
NOTA: Este r&ol es sacado directamente de la pgina del API Aun!ue identifico
algunas de las funciones utilizadas para el procesamiento de imgenes no comprendo la
gran ma#oria de secciones del ar&ol"
o class java"lang"O'-)50
o class com"sun"media"jai"codec"B#PE35od)P+(+1 (implements
com"sun"media"jai"codec"ImageEncodeParam)
o class javax"media"jai"Bo(d)(E90)3d)( (implements java"io"5erializa&le)
o class javax"media"jai"Bo(d)(E90)3d)(Co360+30
o class javax"media"jai"Bo(d)(E90)3d)(Co:<
o class javax"media"jai"Bo(d)(E90)3d)(R)48)50
o class javax"media"jai"Bo(d)(E90)3d)(F(+:
o class javax"media"jai"Bo(d)(E90)3d)(Z)(o
o class javax"media"jai"util"C+6)8)66S0(&32K)< (implements java"lang"8lonea&le java"io"5erializa&le)
o class javax"media"jai"registr#"CIFR)2&60(<
o class javax"media"jai"Co88)50&o3I1+2) (implements java"util"8ollection javax"media"jai"ImageJAI)
o class javax"media"jai"A00(&'70)dI1+2)Co88)50&o3
o class javax"media"jai"Co88)50&o3O: (implements javax"media"jai"Kperation6ode
java"&eans"Propert#8(ange-istener)
o class javax"media"jai"I1+2)S)H7)35)
o class javax"media"jai"I1+2)S0+5;
o class javax"media"jai"R)3d)()dI1+2)L&60 (implements java"util"-ist
java"aJt"image".enderedImage java"io"5erializa&le)
o class java"aJt"image"Co8o(#od)8 (implements java"aJt"2ransparenc#)
o class java"aJt"image"Co1:o3)30Co8o(#od)8
o class javax"media"jai"F8o+0Do7'8)Co8o(#od)8
o class java"aJt"color"Co8o(S:+5) (implements java"io"5erializa&le)
o class javax"media"jai"Co8o(S:+5)JAI
o class javax"media"jai"I=SCo8o(S:+5)
o class java"aJt"Co1:o3)30 (implements java"aJt"image"ImageK&server java"aJt"/enu8ontainer
java"io"5erializa&le)
o class java"aJt"C+3.+6 (implements javax"accessi&ilit#"Accessi&le)
o class javax"media"jai"C+3.+6JAI
o class javax"media"jai"Jidget"I1+2)C+3.+6
o class java"aJt"Co30+&3)(
o class javax"sJing"JCo1:o3)30 (implements java"io"5erializa&le)
o class javax"sJing"JP+3)8 (implements javax"accessi&ilit#"Accessi&le)
o class com"sun"media"jai"Jidget"D&6:8+<JAI (implements
java"aJt"event"/ouse-istener
java"aJt"event"/ouse/otion-istener)
o class java"aJt"S5(o88P+3) (implements javax"accessi&ilit#"Accessi&le)
o class javax"media"jai"Jidget"S5(o88&32I1+2)P+3)8 (implements
java"aJt"event"Adjustment-istener java"aJt"event"8omponent-istener
java"aJt"event"/ouse-istener java"aJt"event"/ouse/otion-istener)
o class javax"media"jai"Coo(d&3+0)I1+2)
o class javax"media"jai"CRIFI1:8 (implements java"aJt"image"rendera&le"8ontextual.enderedImage$actor#)
o class javax"media"jai"N788CRIF
o class javax"media"jai"registr#"CRIFR)2&60(<
o class java"aJt"image"D+0+B744)(
o class javax"media"jai"D+0+B744)(Do7'8)
o class javax"media"jai"D+0+B744)(F8o+0
o class javax"media"jai"E371)(+0)dP+(+1)0)( (implements java"io"5erializa&le)
o class javax"media"jai"operator"Co8o(Q7+30&B)(T<:)
o class javax"media"jai"operator"Co1:o6&0)D)60A8:>+
o class javax"media"jai"operator"DFTD+0+N+07()
o class javax"media"jai"operator"DFTS5+8&32T<:)
o class javax"media"jai"operator"#+9F&80)(S>+:)
o class javax"media"jai"operator"#)d&+3F&80)(S>+:)
o class javax"media"jai"operator"#&3F&80)(S>+:)
o class javax"media"jai"operator"#o6+&5T<:)
o class javax"media"jai"operator"S>)+(D&(
o class javax"media"jai"operator"T(+36:o6)T<:)
o class java"util"E.)30O'-)50 (implements java"io"5erializa&le)
o class java"&eans"P(o:)(0<C>+32)E.)30
o class javax"media"jai"P(o:)(0<C>+32)E.)30JAI
o class javax"media"jai"Co88)50&o3C>+32)E.)30
o class javax"media"jai"P(o:)(0<So7(5)C>+32)E.)30
o class javax"media"jai"R)3d)(&32C>+32)E.)30
o class com"sun"media"jai"codec"FPID)5od)P+(+1 (implements
com"sun"media"jai"codec"ImageDecodeParam)
o class java"aJt"G(+:>&56
o class java"aJt"G(+:>&56,D
o class javax"media"jai"G(+:>&56JAI
o class javax"media"jai"R)3d)(+'8)G(+:>&56 (implements
java"aJt"image"rendera&le".endera&leImage)
o class javax"media"jai"=&60o2(+1 (implements java"io"5erializa&le)
o class com"sun"media"jai"codec"I1+2)Cod)5
o class com"sun"media"jai"codec"I1+2)D)5od)(I1:8 (implements com"sun"media"jai"codec"ImageDecoder)
o class com"sun"media"jai"codec"I1+2)E35od)(I1:8 (implements com"sun"media"jai"codec"ImageEncoder)
o class javax"media"jai"I1+2)L+<o70 (implements java"lang"8lonea&le java"io"5erializa&le)
o class javax"media"jai"I1+2)#IP#+: (implements javax"media"jai"ImageJAI)
o class javax"media"jai"I1+2)P<(+1&d
o class java"io"I3:70S0()+1
o class com"sun"media"jai"codec"S));+'8)S0()+1 (implements java"io"DataInput)
o class com"sun"media"jai"codec"B<0)A((+<S));+'8)S0()+1
o class com"sun"media"jai"codec"F&8)C+5>)S));+'8)S0()+1
o class com"sun"media"jai"codec"F&8)S));+'8)S0()+1
o class com"sun"media"jai"codec"Fo(/+(dS));+'8)S0()+1
o class com"sun"media"jai"codec"#)1o(<C+5>)S));+'8)S0()+1
o class com"sun"media"jai"codec"S)21)30)dS));+'8)S0()+1
o class javax"media"jai"I30)2)(S)H7)35)
o class javax"media"jai"I30)(:o8+0&o3 (implements java"io"5erializa&le)
o class javax"media"jai"I30)(:o8+0&o3B&8&3)+(
o class javax"media"jai"I30)(:o8+0&o3N)+()60
o class javax"media"jai"I30)(:o8+0&o3T+'8)
o class javax"media"jai"I30)(:o8+0&o3B&57'&5
o class javax"media"jai"I30)(:o8+0&o3B&57'&5,
o class javax"media"jai"JAI
o class com"sun"media"jai"codec"JPEGD)5od)P+(+1 (implements
com"sun"media"jai"codec"ImageDecodeParam)
o class com"sun"media"jai"codec"JPEGE35od)P+(+1 (implements
com"sun"media"jai"codec"ImageEncodeParam)
o class javax"media"jai"K)(3)8JAI (implements java"io"5erializa&le)
o class javax"media"jai"Loo;7:T+'8)JAI (implements java"io"5erializa&le)
o class javax"media"jai"Co8o(C7')
o class javax"media"jai"#780&R)6o870&o3R)3d)(+'8)I1+2) (implements
java"aJt"image"rendera&le".endera&leImage java"io"5erializa&le javax"media"jai"1rita&lePropert#5ource)
o class javax"media"jai"remote"N)2o0&+'8)C+:+'&8&0<S)0 (implements java"io"5erializa&le)
o class javax"media"jai"remote"N)2o0&+'8)Co88)50&o3 (implements javax"media"jai"remote"6egotia&le)
o class javax"media"jai"remote"N)2o0&+'8)N71)(&5 (implements javax"media"jai"remote"6egotia&le)
o class javax"media"jai"remote"N)2o0&+'8)N71)(&5R+32) (implements javax"media"jai"remote"6egotia&le)
o class java"util"O'6)(.+'8)
o class javax"media"jai"D)4)(()dD+0+ (implements java"io"5erializa&le)
o class javax"media"jai"D)4)(()dP(o:)(0< (implements
java"&eans"Propert#8(ange-istener)
o class javax"media"jai"R)5<58&32T&8)F+50o(< (implements javax"media"jai"2ile$actor#
javax"media"jai"2ile.ec#cler)
o class javax"media"jai"O:)(+0&o3D)65(&:0o(I1:8 (implements javax"media"jai"KperationDescriptor
java"io"5erializa&le)
o class javax"media"jai"operator"A'6o870)D)65(&:0o(
o class javax"media"jai"operator"AddCo88)50&o3D)65(&:0o(
o class javax"media"jai"operator"AddCo360D)65(&:0o(
o class javax"media"jai"operator"AddCo360ToCo88)50&o3D)65(&:0o(
o class javax"media"jai"operator"AddD)65(&:0o(
o class javax"media"jai"operator"A44&3)D)65(&:0o(
o class javax"media"jai"operator"A3dCo360D)65(&:0o(
o class javax"media"jai"operator"A3dD)65(&:0o(
o class javax"media"jai"operator"AFTI1+2)D)65(&:0o(
o class javax"media"jai"operator"B+3dCo1'&3)D)65(&:0o(
o class javax"media"jai"operator"B+3d#)(2)D)65(&:0o(
o class javax"media"jai"operator"B+3dS)8)50D)65(&:0o(
o class javax"media"jai"operator"B&3+(&B)D)65(&:0o(
o class javax"media"jai"operator"B#PD)65(&:0o(
o class javax"media"jai"operator"Bo(d)(D)65(&:0o(
o class javax"media"jai"operator"Bo9F&80)(D)65(&:0o(
o class javax"media"jai"operator"C8+1:D)65(&:0o(
o class javax"media"jai"operator"Co8o(Co3.)(0D)65(&:0o(
o class javax"media"jai"operator"Co8o(Q7+30&B)(D)65(&:0o(
o class javax"media"jai"operator"Co1:o6&0)D)65(&:0o(
o class javax"media"jai"operator"Co3-72+0)D)65(&:0o(
o class javax"media"jai"operator"Co360+30D)65(&:0o(
o class javax"media"jai"operator"Co3.o8.)D)65(&:0o(
o class javax"media"jai"operator"C(o:D)65(&:0o(
o class javax"media"jai"operator"DCTD)65(&:0o(
o class javax"media"jai"operator"DFTD)65(&:0o(
o class javax"media"jai"operator"D&8+0)D)65(&:0o(
o class javax"media"jai"operator"D&.&d)B<Co360D)65(&:0o(
o class javax"media"jai"operator"D&.&d)Co1:8)9D)65(&:0o(
o class javax"media"jai"operator"D&.&d)D)65(&:0o(
o class javax"media"jai"operator"D&.&d)I30oCo360D)65(&:0o(
o class javax"media"jai"operator"E35od)D)65(&:0o(
o class javax"media"jai"operator"E(od)D)65(&:0o(
o class javax"media"jai"operator"E((o(D&4476&o3D)65(&:0o(
o class javax"media"jai"operator"E9:D)65(&:0o(
o class javax"media"jai"operator"E90()1+D)65(&:0o(
o class javax"media"jai"operator"F&8)Lo+dD)65(&:0o(
o class javax"media"jai"operator"F&8)S0o()D)65(&:0o(
o class javax"media"jai"operator"F&80)()dS7'6+1:8)D)65(&:0o(
o class javax"media"jai"operator"Fo(1+0D)65(&:0o(
o class javax"media"jai"operator"FPID)65(&:0o(
o class javax"media"jai"operator"GIFD)65(&:0o(
o class javax"media"jai"operator"G(+d&)30#+23&07d)D)65(&:0o(
o class javax"media"jai"operator"=&60o2(+1D)65(&:0o(
o class javax"media"jai"operator"IDCTD)65(&:0o(
o class javax"media"jai"operator"IDFTD)65(&:0o(
o class javax"media"jai"operator"IIPD)65(&:0o(
o class javax"media"jai"operator"IIPR)6o870&o3D)65(&:0o(
o class javax"media"jai"operator"I1+2)F7350&o3D)65(&:0o(
o class javax"media"jai"operator"I3.)(0D)65(&:0o(
o class javax"media"jai"operator"JPEGD)65(&:0o(
o class javax"media"jai"operator"Lo2D)65(&:0o(
o class javax"media"jai"operator"Loo;7:D)65(&:0o(
o class javax"media"jai"operator"#+23&07d)D)65(&:0o(
o class javax"media"jai"operator"#+23&07d)SH7+()dD)65(&:0o(
o class javax"media"jai"operator"#+05>CDFD)65(&:0o(
o class javax"media"jai"operator"#+9D)65(&:0o(
o class javax"media"jai"operator"#+9F&80)(D)65(&:0o(
o class javax"media"jai"operator"#)+3D)65(&:0o(
o class javax"media"jai"operator"#)d&+3F&80)(D)65(&:0o(
o class javax"media"jai"operator"#&3D)65(&:0o(
o class javax"media"jai"operator"#&3F&80)(D)65(&:0o(
o class javax"media"jai"operator"#o6+&5D)65(&:0o(
o class javax"media"jai"operator"#780&:8<Co1:8)9D)65(&:0o(
o class javax"media"jai"operator"#780&:8<Co360D)65(&:0o(
o class javax"media"jai"operator"#780&:8<D)65(&:0o(
o class javax"media"jai"operator"No0D)65(&:0o(
o class javax"media"jai"operator"N788D)65(&:0o(
o class javax"media"jai"operator"O(Co360D)65(&:0o(
o class javax"media"jai"operator"O(d)()dD&0>)(D)65(&:0o(
o class javax"media"jai"operator"O(D)65(&:0o(
o class javax"media"jai"operator"O.)(8+<D)65(&:0o(
o class javax"media"jai"operator"P+00)(3D)65(&:0o(
o class javax"media"jai"operator"P)(&od&5S>&40D)65(&:0o(
o class javax"media"jai"operator"P>+6)D)65(&:0o(
o class javax"media"jai"operator"P&)5)/&6)D)65(&:0o(
o class javax"media"jai"operator"PNGD)65(&:0o(
o class javax"media"jai"operator"PN#D)65(&:0o(
o class javax"media"jai"operator"Po8+(ToCo1:8)9D)65(&:0o(
o class javax"media"jai"operator"R)3d)(+'8)D)65(&:0o(
o class javax"media"jai"operator"R)65+8)D)65(&:0o(
o class javax"media"jai"operator"Ro0+0)D)65(&:0o(
o class javax"media"jai"operator"S5+8)D)65(&:0o(
o class javax"media"jai"operator"S>)+(D)65(&:0o(
o class javax"media"jai"operator"S0()+1D)65(&:0o(
o class javax"media"jai"operator"S7'6+1:8)A.)(+2)D)65(&:0o(
o class javax"media"jai"operator"S7'6+1:8)B&3+(<ToG(+<D)65(&:0o(
o class javax"media"jai"operator"S7'0(+50Co360D)65(&:0o(
o class javax"media"jai"operator"S7'0(+50D)65(&:0o(
o class javax"media"jai"operator"S7'0(+50F(o1Co360D)65(&:0o(
o class javax"media"jai"operator"T>()6>o8dD)65(&:0o(
o class javax"media"jai"operator"TIFFD)65(&:0o(
o class javax"media"jai"operator"T(+368+0)D)65(&:0o(
o class javax"media"jai"operator"T(+36:o6)D)65(&:0o(
o class javax"media"jai"operator"U36>+(:#+6;D)65(&:0o(
o class javax"media"jai"operator"URLD)65(&:0o(
o class javax"media"jai"operator"F+(:D)65(&:0o(
o class javax"media"jai"operator"Io(Co360D)65(&:0o(
o class javax"media"jai"operator"Io(D)65(&:0o(
o class javax"media"jai"O:)(+0&o3Nod)S7::o(0 (implements java"io"5erializa&le)
o class javax"media"jai"O:)(+0&o3R)2&60(< (implements java"io"Externaliza&le)
o class java"io"O70:70S0()+1
o class com"sun"media"jai"codec"S));+'8)O70:70S0()+1
o class javax"media"jai"P+5;)dI1+2)D+0+
o class java"aJt"image"rendera&le"P+(+1)0)(B8o5; (implements java"lang"8lonea&le java"io"5erializa&le)
o class javax"media"jai"P+(+1)0)(B8o5;JAI (implements javax"media"jai"Parameter-ist)
o class javax"media"jai"P+(+1)0)(L&60D)65(&:0o(I1:8 (implements javax"media"jai"Parameter-istDescriptor
java"io"5erializa&le)
o class javax"media"jai"P+(+1)0)(L&60I1:8 (implements javax"media"jai"Parameter-ist java"io"5erializa&le)
o class javax"media"jai"remote"N)2o0&+'8)C+:+'&8&0< (implements java"io"5erializa&le)
o class javax"media"jai"tilecodec"T&8)Cod)5P+(+1)0)(L&60
o class javax"media"jai"P)(6:)50&.)T(+364o(1 (implements java"lang"8lonea&le java"io"5erializa&le)
o class javax"media"jai"P&9)8A55)66o(
o class javax"media"jai"P8+3+(I1+2) (implements javax"media"jai"ImageJAI java"aJt"image".enderedImage)
o class javax"media"jai"O:I1+2)
o class javax"media"jai"A()+O:I1+2)
o class javax"media"jai"G)o1)0(&5O:I1+2)
o class javax"media"jai"S5+8)O:I1+2)
o class javax"media"jai"F+(:O:I1+2)
o class javax"media"jai"Po&30O:I1+2)
o class javax"media"jai"Co8o(1+:O:I1+2)
o class javax"media"jai"N788O:I1+2)
o class javax"media"jai"So7(5)8)66O:I1+2)
o class javax"media"jai"S0+0&60&56O:I1+2)
o class javax"media"jai"U30&8)dO:I1+2)
o class javax"media"jai"remote"P8+3+(I1+2)S)(.)(P(o9< (implements
javax"media"jai"remote".emote.enderedImage)
o class javax"media"jai"R)1o0)I1+2)
o class javax"media"jai"R)3d)()dI1+2)Ad+:0)(
o class javax"media"jai"A00(&'70)dI1+2)
o class javax"media"jai"F(&0+'8)R)3d)()dI1+2)Ad+:0)( (implements
java"aJt"image"1rita&le.enderedImage)
o class javax"media"jai"R)3d)()dO: (implements javax"media"jai"Kperation6ode
java"&eans"Propert#8(ange-istener java"io"5erializa&le)
o class javax"media"jai"remote"R)1o0)R)3d)()dO: (implements
javax"media"jai"remote".emote.enderedImage)
o class javax"media"jai"S3+:6>o0I1+2) (implements java"aJt"image"2ileK&server)
o class javax"media"jai"T&8)dI1+2) (implements java"&eans"Propert#8(ange-istener
java"aJt"image"1rita&le.enderedImage)
o class com"sun"media"jai"codec"PNGD)5od)P+(+1 (implements
com"sun"media"jai"codec"ImageDecodeParam)
o class com"sun"media"jai"codec"PNGE35od)P+(+1 (implements
com"sun"media"jai"codec"ImageEncodeParam)
o class com"sun"media"jai"codec"PNGE35od)P+(+1.G(+<
o class com"sun"media"jai"codec"PNGE35od)P+(+1.P+8)00)
o class com"sun"media"jai"codec"PNGE35od)P+(+1.RGB
o class com"sun"media"jai"codec"PNGS722)60)dP+8)00)E30(< (implements java"io"5erializa&le)
o class com"sun"media"jai"codec"PN#E35od)P+(+1 (implements
com"sun"media"jai"codec"ImageEncodeParam)
o class java"&eans"P(o:)(0<C>+32)S7::o(0 (implements java"io"5erializa&le)
o class javax"media"jai"P(o:)(0<C>+32)S7::o(0JAI
o class javax"media"jai"P(o:)(0<So7(5)I1:8 (implements javax"media"jai"Propert#5ource java"io"5erializa&le)
o class javax"media"jai"F(&0+'8)P(o:)(0<So7(5)I1:8 (implements
javax"media"jai"1rita&lePropert#5ource)
o class javax"media"jai"iterator"R+3do1I0)(F+50o(<
o class javax"media"jai"util"R+32) (implements java"io"5erializa&le)
o class javax"media"jai"R+60)(A55)66o(
o class javax"media"jai"R+60)(F+50o(<
o class javax"media"jai"R+60)(Fo(1+0T+2
o class javax"media"jai"registr#"RCIFR)2&60(<
o class javax"media"jai"iterator"R)50I0)(F+50o(<
o class javax"media"jai"R)2&60(<#od)
o class javax"media"jai"registr#"Co88)50&o3R)2&60(<#od)
o class javax"media"jai"registr#"R)1o0)R)3d)(+'8)R)2&60(<#od)
o class javax"media"jai"registr#"R)1o0)R)3d)()dR)2&60(<#od)
o class javax"media"jai"registr#"R)3d)(+'8)Co88)50&o3R)2&60(<#od)
o class javax"media"jai"registr#"R)3d)(+'8)R)2&60(<#od)
o class javax"media"jai"registr#"R)3d)()dR)2&60(<#od)
o class javax"media"jai"registr#"T&8)D)5od)(R)2&60(<#od)
o class javax"media"jai"registr#"T&8)E35od)(R)2&60(<#od)
o class javax"media"jai"registr#"R)1o0)CRIFR)2&60(<
o class javax"media"jai"remote"R)1o0)D)65(&:0o(I1:8 (implements javax"media"jai"remote".emoteDescriptor)
o class javax"media"jai"remote"JAIR#ID)65(&:0o(
o class javax"media"jai"remote"R)1o0)JAI
o class javax"media"jai"registr#"R)1o0)RIFR)2&60(<
o class javax"media"jai"R)3d)(+'8)I1+2)Ad+:0)( (implements java"aJt"image"rendera&le".endera&leImage
javax"media"jai"1rita&lePropert#5ource)
o class javax"media"jai"R)3d)(+'8)O: (implements javax"media"jai"Kperation6ode
java"aJt"image"rendera&le".endera&leImage java"io"5erializa&le javax"media"jai"1rita&lePropert#5ource)
o class javax"media"jai"remote"R)1o0)R)3d)(+'8)O:
o class javax"media"jai"registr#"RIFR)2&60(<
o class javax"media"jai"ROI (implements java"io"5erializa&le)
o class javax"media"jai"ROIS>+:)
o class javax"media"jai"iterator"Roo;I0)(F+50o(<
o class java"aJt"image"S+1:8)#od)8
o class java"aJt"image"Co1:o3)30S+1:8)#od)8
o class javax"media"jai"Co1:o3)30S+1:8)#od)8JAI
o class javax"media"jai"S)H7)30&+8I1+2)
o class javax"media"jai"remote"S)(&+8&B+'8)R)3d)()dI1+2) (implements java"aJt"image".enderedImage
java"io"5erializa&le)
o class javax"media"jai"remote"S)(&+8&B)(F+50o(<
o class com"sun"media"jai"codec"S0()+1S)21)30
o class java"lang"T>(o/+'8) (implements java"io"5erializa&le)
o class java"lang"E95):0&o3
o class java"lang"R730&1)E95):0&o3
o class javax"media"jai"util"I1+2&32E95):0&o3
o class javax"media"jai"remote"R)1o0)I1+2&32E95):0&o3
o class com"sun"media"jai"codec"TIFFD)5od)P+(+1 (implements
com"sun"media"jai"codec"ImageDecodeParam)
o class com"sun"media"jai"codec"TIFFD&()50o(< (implements java"io"5erializa&le)
o class com"sun"media"jai"codec"TIFFE35od)P+(+1 (implements
com"sun"media"jai"codec"ImageEncodeParam)
o class com"sun"media"jai"codec"TIFFF&)8d (implements java"lang"8ompara&le java"io"5erializa&le)
o class javax"media"jai"tilecodec"T&8)Cod)5D)65(&:0o(I1:8 (implements
javax"media"jai"tilecodec"2ile8odecDescriptor)
o class javax"media"jai"tilecodec"GZIPT&8)Cod)5D)65(&:0o(
o class javax"media"jai"tilecodec"JPEGT&8)Cod)5D)65(&:0o(
o class javax"media"jai"tilecodec"R+/T&8)Cod)5D)65(&:0o(
o class javax"media"jai"tilecodec"T&8)D)5od)(I1:8 (implements javax"media"jai"tilecodec"2ileDecoder)
o class javax"media"jai"registr#"T&8)D)5od)(R)2&60(<
o class javax"media"jai"tilecodec"T&8)E35od)(I1:8 (implements javax"media"jai"tilecodec"2ileEncoder)
o class javax"media"jai"registr#"T&8)E35od)(R)2&60(<
o class javax"media"jai"U3:+5;)dI1+2)D+0+
o class javax"media"jai"F+(: (implements java"io"5erializa&le)
o class javax"media"jai"F+(:G(&d
o class javax"media"jai"F+(:P)(6:)50&.)
o class javax"media"jai"F+(:Po8<3o1&+8
o class javax"media"jai"F+(:A44&3)
o class javax"media"jai"F+(:C7'&5
o class javax"media"jai"F+(:G)3)(+8Po8<3o1&+8
o class javax"media"jai"F+(:Q7+d(+0&5
I30)(4+5) =&)(+(5><
o interface javax"media"jai"C+5>)dT&8)
o interface java"lang"C8o3)+'8)
o interface com"sun"media"jai"codec"I1+2)D)5od)P+(+1 (also extends java"io"5erializa&le)
o interface com"sun"media"jai"codec"I1+2)E35od)P+(+1 (also extends java"lang"8lonea&le
java"io"5erializa&le)
o interface com"sun"media"jai"codec"I1+2)E35od)P+(+1 (also extends
com"sun"media"jai"codec"ImageDecodeParam java"io"5erializa&le)
o interface javax"media"jai"Co88)50&o3I1+2)F+50o(<
o interface javax"media"jai"Co8o(#od)8F+50o(<
o interface java"util"E.)30L&60)3)(
o interface javax"media"jai"T&8)Co1:70+0&o3L&60)3)(
o interface javax"media"jai"Jidget"I1+2)C+3.+6.P+&30L&60)3)(
o interface com"sun"media"jai"codec"I1+2)D)5od)(
o interface com"sun"media"jai"codec"I1+2)E35od)(
o interface javax"media"jai"I1+2)F7350&o3
o interface javax"media"jai"util"I1+2&32L&60)3)(
o interface com"sun"media"jai"remote"JAIS)(.)(Co34&27(+0&o3S:&
o interface javax"media"jai"O:)(+0&o3R)2&60(<S:&
o interface javax"media"jai"P+(+1)0)(L&60
o interface javax"media"jai"P+(+1)0)(L&60D)65(&:0o(
o interface javax"media"jai"P(o:)(0<C>+32)E1&00)(
o interface javax"media"jai"O:)(+0&o3Nod) (also extends javax"media"jai"Propert#5ource)
o interface javax"media"jai"F(&0+'8)P(o:)(0<So7(5) (also extends javax"media"jai"Propert#5ource)
o interface javax"media"jai"I1+2)JAI
o interface javax"media"jai"P(o:)(0<So7(5)
o interface javax"media"jai"O:)(+0&o3Nod) (also extends javax"media"jai"Propert#8(angeEmitter)
o interface javax"media"jai"F(&0+'8)P(o:)(0<So7(5) (also extends javax"media"jai"Propert#8(angeEmitter)
o interface javax"media"jai"I1+2)JAI
o interface javax"media"jai"iterator"R+3do1I0)(
o interface javax"media"jai"iterator"F(&0+'8)R+3do1I0)(
o interface javax"media"jai"iterator"R)50I0)(
o interface javax"media"jai"iterator"Roo;I0)(
o interface javax"media"jai"iterator"F(&0+'8)Roo;I0)( (also extends
javax"media"jai"iterator"1rita&le.ectIter)
o interface javax"media"jai"iterator"F(&0+'8)R)50I0)(
o interface javax"media"jai"iterator"F(&0+'8)Roo;I0)( (also extends
javax"media"jai"iterator".ooGIter)
o interface javax"media"jai"R)2&60(<E8)1)30D)65(&:0o(
o interface javax"media"jai"O:)(+0&o3D)65(&:0o(
o interface javax"media"jai"remote"R)1o0)D)65(&:0o(
o interface javax"media"jai"tilecodec"T&8)Cod)5D)65(&:0o(
o interface javax"media"jai"remote"R)1o0)RIF
o interface javax"media"jai"remote"R)1o0)CRIF
o interface javax"media"jai"R)3d)(+'8)Co88)50&o3I1+2)F+50o(<
o interface java"aJt"image"R)3d)()dI1+2)
o interface javax"media"jai"remote"R)1o0)R)3d)()dI1+2)
o interface java"io"S)(&+8&B+'8)
o interface com"sun"media"jai"codec"I1+2)D)5od)P+(+1 (also extends java"lang"8lonea&le)
o interface com"sun"media"jai"codec"I1+2)E35od)P+(+1 (also extends java"lang"8lonea&le
java"io"5erializa&le)
o interface com"sun"media"jai"codec"I1+2)E35od)P+(+1 (also extends java"lang"8lonea&le
com"sun"media"jai"codec"ImageDecodeParam)
o interface javax"media"jai"remote"N)2o0&+'8)
o interface javax"media"jai"P(o:)(0<G)3)(+0o(
o interface javax"media"jai"remote"S)(&+8&B+'8)S0+0)
o interface javax"media"jai"remote"S)(&+8&B)(
o interface com"sun"media"jai"codec"S0()+1S)21)30#+::)(
o interface javax"media"jai"T&8)C+5>)
o interface javax"media"jai"tilecodec"T&8)D)5od)(
o interface javax"media"jai"tilecodec"T&8)D)5od)(F+50o(<
o interface javax"media"jai"tilecodec"T&8)E35od)(
o interface javax"media"jai"tilecodec"T&8)E35od)(F+50o(<
o interface javax"media"jai"T&8)F+50o(<
o interface javax"media"jai"T&8)R)5<58)(
o interface javax"media"jai"T&8)R)H7)60
o interface javax"media"jai"T&8)S5>)d78)(
o interface javax"media"jai"Jidget"V&)/:o(0L&60)3)(
APLICACIN
6ota3 Aun!ue el tema de procesamiento de imgenes se entiende # son claros los
conceptos # adems de !ue todo eso es aplica&le con java no estuvo en sa&er el poder
realizar un programa !ue mostrara todo lo anteriormente mencionado de&ido a !ue esto
implica una nivel de manejo de java mu# alto o avanzado en cam&io lo !ue si pude
(acer fue investigar varios ejemplos relacionados con el tema # !ue pueden mostrar
claramente como funcionan las aplicaciones de java para el procesamiento avanzado de
imagen"
Ejemplo de (istograma3
import java"io"$ile<
import java"aJt"Eorder-a#out<
import java"aJt"4rid-a#out<
import java"aJt"$loJ-a#out<
import java"aJt"Dimension<
import java"aJt"$ont<
import java"aJt"image"rendera&le"ParameterElocG<
import java"aJt"image"DataEuffer<
import java"aJt"event"V<
import java"aJt"8olor<
import javax"sJing"JPanel<
import javax"sJing"JEutton<
import javax"sJing"J-a&el<
import javax"sJing"&order"Etc(edEorder<
import javax"sJing"&order"-ineEorder<
import javax"sJing"event"V<
import javax"media"jai"JAI<
import javax"media"jai"PlanarImage<
import javax"media"jai"Distogram<
import javax"media"jai"-ooGup2a&leJAI<
import javax"media"jai".enderedKp<
import java"net"0.-<
import java"net"/alformed0.-Exception<
pu&lic class DistogramDemo extends JPanel
implements Action-istener Q
private PlanarImage source R null<
private PlanarImage target R null<
private Panner panner<
private JEutton reset<
private JEutton e!ual<
private JEutton norm<
private JEutton piece<
private ImageDispla# canvas<
private OHPlot grap(<
pu&lic DistogramDemo(5tring filename) Q
tr#
Q
source R JAI"create(+url+ neJ 0.- (filename) )<
S
catc( ( /alformed0.-Exception e)
Q
return<
S
canvas R neJ ImageDispla#(source)<
canvas"set-a#out(neJ $loJ-a#out($loJ-a#out".I4D2 2 2))<
panner R neJ Panner(canvas source ?2C)<
panner"setEacGground(8olor"red)<
panner"setEorder(neJ Etc(edEorder())<
canvas"add(panner)<
$ont font R neJ $ont(+5ans5erif+ $ont"EK-D ?2)<
J-a&el title R neJ J-a&el(+ Distogram+)<
title"set$ont(font)<
title"set-ocation(= ;2)<
setKpa!ue(true)<
set-a#out(neJ Eorder-a#out())<
setEacGground(8olor"J(ite)<
grap( R neJ OHPlot()<
grap("setEacGground(8olor"&lacG)<
grap("setEorder(neJ -ineEorder(neJ 8olor(==2>>) ?))<
8olor&ar c&ar R neJ 8olor&ar()<
c&ar"setEacGground(8olor"&lacG)<
c&ar"setPreferred5ize(neJ Dimension(2>@ 2>))<
c&ar"setEorder(neJ -ineEorder(neJ 8olor(2>>=2>>)2))<
JPanel (istNpanel R neJ JPanel()<
(istNpanel"set-a#out(neJ Eorder-a#out())<
(istNpanel"setEacGground(8olor"J(ite)<
(istNpanel"add(grap( Eorder-a#out"8E62E.)<
(istNpanel"add(c&ar Eorder-a#out"5K02D)<
JPanel panel R neJ JPanel()<
panel"set-a#out(neJ 4rid-a#out(2?>>))<
panel"setEacGground(8olor"J(ite)<
panel"add(canvas)<
panel"add((istNpanel)<
JPanel controlPanel R neJ JPanel()<
controlPanel"set-a#out(neJ $loJ-a#out())<
reset R neJ JEutton(+.eset+)<
e!ual R neJ JEutton(+E!ualize+)<
norm R neJ JEutton(+6ormalize+)<
piece R neJ JEutton(+PieceJise+)<
reset"addAction-istener(t(is)<
e!ual"addAction-istener(t(is)<
norm"addAction-istener(t(is)<
piece"addAction-istener(t(is)<
controlPanel"add(reset)<
controlPanel"add(e!ual)<
controlPanel"add(norm)<
controlPanel"add(piece)<
add(title Eorder-a#out"6K.2D)<
add(panel Eorder-a#out"8E62E.)<
add(controlPanel Eorder-a#out"5K02D)<
II original (istogram (remains unmodified)
grap("plot( getDistogram(source) )<
S
pu&lic int9: getDistogram(PlanarImage image) Q
II set up t(e (istogram
int9: &ins R Q 2>@ S<
dou&le9: loJ R Q ="=D S<
dou&le9: (ig( R Q 2>@"=D S<
Distogram (istogram R neJ Distogram(&ins loJ (ig()<
ParameterElocG p& R neJ ParameterElocG()<
p&"add5ource(image)<
p&"add((istogram)<
p&"add(null)<
p&"add(?)<
p&"add(?)<
.enderedKp op R JAI"create(+(istogram+ p& null)<
(istogram R (Distogram) op"getPropert#(+(istogram+)<
II get (istogram contents
int9: localNarra# R neJ int9(istogram"get6umEins(=):<
for ( int i R =< i X (istogram"get6umEins(=)< iTT ) Q
localNarra#9i: R (istogram"getEin5ize(= i)<
S
return localNarra#<
S
II one Ja# to do t(is (old st#le)
II t(is could also &e done Jit( matc(cdf
pu&lic PlanarImage e!ualize() Q
int sum R =<
&#te9: cumulative R neJ &#te92>@:<
int arra#9: R getDistogram(source)<
float scale R 2>>"=$ I (float) (source"get1idt(() V
source"getDeig(t())<
for ( int i R =< i X 2>@< iTT ) Q
sum TR arra#9i:<
cumulative9i: R (&#te)((sum V scale) T ">$)<
S
-ooGup2a&leJAI looGup R neJ -ooGup2a&leJAI(cumulative)<
ParameterElocG p& R neJ ParameterElocG()<
p&"add5ource(source)<
p&"add(looGup)<
return JAI"create(+looGup+ p& null)<
S
II for a single &and
pu&lic PlanarImage normalize() Q
dou&le9: mean R neJ dou&le9: Q ?2C"= S<
dou&le9: stDev R neJ dou&le9: Q ;A"= S<
float9:9: 8D$norm R neJ float9?:9:<
8D$norm9=: R neJ float92>@:<
dou&le mu R mean9=:<
dou&le tJo5igma5!uared R 2"=VstDev9=:VstDev9=:<
8D$norm9=:9=: R (float)/at("exp(*muVmuItJo5igma5!uared)<
for ( int i R ?< i X 2>@< iTT ) Q
dou&le deviation R i * mu<
8D$norm9=:9i: R 8D$norm9=:9i*?: T
(float)/at("exp(*deviationVdeviationItJo5igma5!uared)<
S
dou&le 8D$norm-ast R 8D$norm9=:92>>:<
for ( int i R =< i X 2>@< iTT ) Q
8D$norm9=:9i: IR 8D$norm-ast<
S
int9: &ins R Q 2>@ S<
dou&le9: loJ R Q ="=D S<
dou&le9: (ig( R Q 2>@"=D S<
Distogram (stgrm R neJ Distogram(&ins loJ (ig()<
.enderedKp fmt R JAI"create(+(istogram+
source
(stgrm
null
neJ Integer(?)
neJ Integer(?))<
return JAI"create(+matc(cdf+ fmt 8D$norm)<
S
pu&lic PlanarImage pieceJise() Q
float9:9:9: &p R neJ float9?:92:9:<
&p9=:9=: R neJ float9: Q ="=$ ;2"=$ @A"=$ 2>>"=$ S<
&p9=:9?: R neJ float9: Q ="=$ ?2C"=$ ??2"=$ 2>>"=$ S<
return JAI"create(+pieceJise+ source &p)<
S
pu&lic void actionPerformed(ActionEvent e) Q
JEutton & R (JEutton)e"get5ource()<
if ( & RR reset ) Q
target R source<
S else if ( & RR e!ual ) Q
target R e!ualize()<
S else if ( & RR norm ) Q
target R normalize()<
S else if ( & RR piece ) Q
target R pieceJise()<
S
canvas"set(target)<
grap("plot( getDistogram(target) )<
S
S

Potrebbero piacerti anche