Tema 14 - Imágenes en Java

download Tema 14 - Imágenes en Java

of 42

Transcript of Tema 14 - Imágenes en Java

  • 7/22/2019 Tema 14 - Imgenes en Java

    1/42

    ITSON Manuel Domitsu Kono

    Tema 14

    Imgenes en JavaUna imagen es un arreglo bidimensional de colores. Cada elemento de un arreglose llama pixel. Una imagen es diferente de una superficie de dibujo. Los pixeles deuna imagen no coinciden necesariamente con un pixel en la superficie de dibujo.Una imagen tiene ancho y un alto, medido en pixeles y un sistema decoordenadas que es independiente de la superficie de dibujo.

    En Java 2D, una imagen se representa por las clases I magey Buf f eredI mage,figura 14.1. La clase abstracta I magerepresenta una imagen como un arreglo

    rectangular de pixeles. La clase Buf f eredI magele permite a la aplicacintrabajar directamente con los datos de la imagen (por ejemplo obteniendo oestableciendo el color de un pixel). Esta clase administra directamente la imagenen memoria y provee mtodos para almacenar, interpretar y obtener datos de lospixeles.

    Figura 14.1 Clases que Representan una Imagen

  • 7/22/2019 Tema 14 - Imgenes en Java

    2/42

    548 Imgenes en Java

    ITSON Manuel Domitsu Kono

    Un objeto de tipo Buf f eredI magees esencialmente un objeto del tipo I mageconun buffer de datos accesible, por lo que la hace ms eficiente para trabajar que

    con un objeto del tipo I mage. Un objeto de tipo Buf f eredI magetiene un modelode color, un objeto del tipo Col or Model y un entramado de los datos de laimagen, un objeto del tipo Rast er , figura 14.2.

    Figura 14.2 Un objeto de Tipo Buffered Image

    El objeto de tipo Col or Model provee una interpretacin de los pixeles de laimagen dentro del espacio de color. Un espacio de color es esencialmente unacoleccin de todos los colores que pueden representarse en un dispositivo

    particular. Los monitores, por ejemplo, por lo general definen su espacio de colorusando el color de espacio GB. Una impresora, por otro lado puede usar elespacio de color CMYK. Las imgenes pueden usar una de varias subclases de

    Col or Model en las bibliotecas de la API de java 2D:

    Component Col or Model , en la que un pixel se representa por variosvalores discretos, tipicamente bytes, cada uno representando unacomponente del color, como el componente rojo en la representacin RGB.

    Di r ect Col orModel , en la que todos los componentes de un color estnempaquetados juntos en bits separados del mismo valor de un pixel.

    I ndexCol orModel , en la que cada pixel es un valor representado comoun ndice en una paleta de colores.

    El objeto de tipo Rast er almacena los datos reales de los pixeles para unaimagen en un arreglo rectangular accesado por las coordenadas x, y. Estformado de dos partes:

    Un buffer de datos, que contiene los datos crudos de la imagen.

    Un modelo de muestreo, que describe como los datos estn organizados enel buffer.

    El entramado, realiza las siguientes tareas:

    Representa las coordenadas rectangulares de la imagen.

    Mantiene la imagen en memoria.

    Provee de mecanismos para crear mltiples subimgenes a partir de unsolo buffer de los datos de la imagen.

    Provee de mtodos para accesar a los pixeles especficos de una imagen.

  • 7/22/2019 Tema 14 - Imgenes en Java

    3/42

    Tema 14 Imgenes en Java 549

    ITSON Manuel Domitsu Kono

    La clase Buf f eredI mageuna serie de constantes para los diferentes tipos deimgenes (modelos de colores). La tabla 14.1 describe los diferentes tipos deimgenes.

    Tabla 14.1 Tipos de Imagen de la clase BufferedImage.

    Tipo DescripcinTYPE_3BYTE_BGR Representa una imagen con componentes RGB de 8 bits, con loscolores azul, verde y rojo almacenados en 3 bytes.

    TYPE_4BYTE_ABGR Representa una imagen con componentes RGBA de 8 bits, con loscolores azul, verde y rojo almacenados en 3 bytes y un byte para elvalor de alfa. Los datos de los colores no estn premultiplicados conel valor de alfa.

    TYPE_4BYTE_ABGR_PRE Representa una imagen con componentes RGBA de 8 bits, con loscolores azul, verde y rojo almacenados en 3 bytes y un byte para elvalor de alfa. Los datos de los colores estn premultiplicados con elvalor de alfa.

    TYPE_BYTE_BINARY Representa una imagen con pixeles opacos de 1, 2 o 4 bitsempaquetados. Los valores de los pixeles representan indices a unatabla de colores.

    TYPE_BYTE_GRAY Representa una imagen con pixeles en tonos de grises. El valor delpixel es un tono de gris (0 a 255).

    TYPE_BYTE_INDEXED Representa una imagen con pixeles opacos de 1 byte. Los valores delos pixeles representan indices a una tabla de colores de 256 valores,216 colores y el resto de tonos de grises.

    TYPE_CUSTOM Tipo de imagen no reconocido. Debe ser una imagen con formatoespecial.

    TYPE_INT_ARGB Representa una imagen con componentes RGBA de 8 bits, con loscolores azul, verde y rojo y el valor de alfa empacados en enteros.Los datos de los colores no estn premultiplicados con el valor dealfa.

    TYPE_INT_ARGB_PRE Representa una imagen con componentes RGBA de 8 bits, con loscolores azul, verde y rojo y el valor de alfa empacados en enteros.Los datos de los colores estn premultiplicados con el valor de alfa.

    TYPE_INT_BGR Representa una imagen con componentes RGBA de 8 bits, con loscolores azul, verde y rojo empacados en enteros. No hay valor dealfa.

    TYPE_INT_RGB Representa una imagen con componentes RGBA de 8 bits, con loscolores azul, verde y empacados en enteros. No hay valor de alfa.

    TYPE_USHORT_555_RGB Representa una imagen con componentes RGB de 5-5-5 bits para loscolores azul, verde y rojo. No hay valor de alfa.

    TYPE_USHORT_565_RGB Representa una imagen con componentes RGB de 5-6-5 bits para loscolores azul, verde y rojo. No hay valor de alfa.

    TYPE_USHORT_GRAY Representa una imagen con pixeles en tonos de grises.TYPE_INT_ARGB Representa una imagen con componentes RGBA de 8 bits, con los

    colores azul, verde y rojo y el valor de alfa empacados en enteros.Los datos de los colores no estn premultiplicados con el valor dealfa.

    La tabla 14.2 muestra algunos de los mtodos de la clase Buf f eredI mage.

  • 7/22/2019 Tema 14 - Imgenes en Java

    4/42

    550 Imgenes en Java

    ITSON Manuel Domitsu Kono

    Tabla 14.3 Mtodos de la clase BufferedImage.publ i c BufferedImage( i nt wi dt h, i nt hei ght , i nt i mageType)

    Construye una imagen del tipo Buf f eredI magede alguno de los tipos de imagenes predefinidos.publ i c i nt getWidth( )publ i c i nt getHeight( )

    Regresan el ancho y la altura de la imagen del tipo Buf f eredI mage, respectivamente.publ i c Gr aphi cs2D createGraphics( )

    Crea un objeto del tipo Gr aphi cs2Dque puede usarse para dibujar sobre esta imagen.publ i c Buf f eredI mage getSubimage( i nt x , i nt y, i nt w, i nt h)

    Regresa una subimagen de esta imagen especificada por la regin rectangular. La imagenregresada comparte el mismo arreglo de datos que la imagen original.

    Dibujado de Imgenes

    Al igual que con las grficas, podemos dibujar una figura sobre cualquier

    componente de swing que sea desplegable. La clase Gr aphi cs2Ddispone delmtodo drawI mage( ) cuya sintaxis se muestra en la tabla 14.4.

    Tabla 14.4 Mtodo para dibujar una Imagen BufferedImage.publ i c abst r act voi d drawImage( Buf f eredI mage i mg, Buf f eredI mageOp op,

    i nt x, i nt y)

    Despliega una imagen del tipo Buf f eredI mage, que es filtrada con un filtro descrito por el objetoop, en las coordenadas (x, y).

    El siguiente cdigo muestra un mtodo que permite dibujar una imagen

    . . .

    / * ** Est a cl ase cont i ene mtodos par a car gar , guardar y pr ocesar i magenes** @aut hor mdomi t su*/

    publ i c cl ass Cont r ol {. . ./ / I magen a ser despl egadapr i vat e Buf f er edI mage dbi ;

    . . .

    / * ** Est e met odo despl i ega l a i magen del at r i but o dbi* del t i po Buf f er edI mage sobr e el panel l i enzo* @paraml i enzo Panel sobr e el que se despl i ega l a i magen*/

    publ i c voi d despl i egai magen( J Panel l i enzo) {/ / Si no hay una i magen par a despl egari f ( dbi == nul l ) {

  • 7/22/2019 Tema 14 - Imgenes en Java

    5/42

    Tema 14 Imgenes en Java 551

    ITSON Manuel Domitsu Kono

    J Opt i onPane. showMessageDi al og( l i enzo,"No hay una i magen par a despl egar " ) ;

    return;}/ / Obt i ene el t amao de l a i mageni nt al t oI magen = dbi . get Hei ght ( ) ;i nt anchoI magen = dbi . getWi dt h( ) ;

    / / Est abl ece el t amao del panel al t amao de l a i magenl i enzo. setPref er r edSi ze(new Di mensi on( al t oI magen, anchoI magen) ) ;l i enzo. reval i dat e( ) ;

    Gr aphi cs g = l i enzo. get Gr aphi cs( ) ;Gr aphi cs2D g2 = ( Gr aphi cs2D) g;

    / / Di buj a l a i magen sobr e el panelg2. dr awI mage( dbi , nul l , 1, 1) ;

    }

    . . .

    }

    La figura 14.3 muestra una imagen desplegada por el mtodo anterior.

    Figura 14.3 Despliegue de una Imagen

  • 7/22/2019 Tema 14 - Imgenes en Java

    6/42

    552 Imgenes en Java

    ITSON Manuel Domitsu Kono

    Creacin de Imgenes

    Podemos crear una nueva imagen (una imagen con todos los pixeles en cero)

    para posteriormente dibujar sobre ella. Para ello se sigue el siguiente

    procedimiento:

    1. Crear un objeto del tipo Buf f eredI mage.

    2. Obtener del objeto del tipo Buf f eredI mage, un objeto del tipo

    Gr aphi cs2D, para dibujar sobre la imagen.

    3. Dibujar sobre la imagen usando los mtodos del objeto del tipo

    Gr aphi cs2D.

    El siguiente cdigo muestra un mtodo que permite crear una imagen nueva.

    publ i c cl ass Cont r ol {. . ./ / I magen or i gi nalpr i vat e Buf f er edI mage obi ;

    / * ** Est e mtodo cr ea un obj eto de t i po Buf f eredI mage del* t amao del panel del par amet r o* @paraml i enzo Panel que est abl ece el t amao de l a i magen.*/

    publ i c voi d nuevaI magen( J Panel l i enzo) {/ / Obt i ene el t amao del paneli nt al t oI magen = l i enzo. get Hei ght ( ) ;

    i nt anchoI magen = l i enzo. get Wi dt h( ) ;

    / / Cr ea una i magen del t amao del panelobi = new Buf f eredI mage( anchoI magen, al t oI magen,

    Buf f eredI mage. TYPE_I NT_RGB) ;

    Gr aphi cs2D g2 = obi . cr eateGr aphi cs( ) ;

    / / Est abl ece el col or de f ondog2. set Backgr ound( Col or. whi t e) ;g2. cl earRect ( 0, 0, anchoI magen, al t oI magen) ;

    / / Hace que l a r ef er enci a dbi apunt e a obidbi = obi ;

    }

    . . .}

    El siguiente cdigo dibuja sobre una imagen (nueva o existente):

  • 7/22/2019 Tema 14 - Imgenes en Java

    7/42

    Tema 14 Imgenes en Java 553

    ITSON Manuel Domitsu Kono

    / * ** Est e mtodo di buj a una f i gura sobr e l a i magen obi* @par am f r ame Vent ana sobr e l a que se despl i ega el* mensaj e de er r or*/

    publ i c voi d di buj aEnI magen( J Fr ame f r ame) {/ / Si no hay una i magen para di buj ari f ( obi == nul l ) {

    J Opt i onPane. showMessageDi al og( f r ame,"No hay una i magen para di buj ar" ) ;

    return;}

    / / Obt i ene el cont ext o de gr af i caci n de l a i magenGr aphi cs2D g2 = obi . cr eateGr aphi cs( ) ;

    / / Est abl ece el col or de una t r ayect or i ag2. set Pai nt ( Col or . bl ack) ;/ / crea una t r ayect or i aPat h2D t r ayect or i a = new Pat h2D. Doubl e( Pat h2D. WI ND_EVEN_ODD) ;

    t r ayect or i a. moveTo( 50, 50) ;t r ayector i a. l i neTo( 70, 44) ;t r ayect or i a. cur veTo( 100, 10, 140, 80, 160, 80) ;t r ayectori a. l i neTo( 190, 40) ;t r ayectori a. l i neTo( 200, 56) ;t r ayect or i a. quadTo( 100, 150, 70, 60) ;t r ayector i a. cl osePat h( ) ;

    / / Di buj a l a tr ayect or i a sobr e l a i magen obig2. dr aw( t r ayectori a) ;

    / / Hace que l a r ef er enci a dbi apunt e a obidbi = obi ;

    }

    Las figuras 14.4 y 14.5 muestran una figura sobre una nueva imagen y sobre unaimagen existente, dibujada por el mtodo anterior, respectivamente.

  • 7/22/2019 Tema 14 - Imgenes en Java

    8/42

    554 Imgenes en Java

    ITSON Manuel Domitsu Kono

    Figura 14.4 Figura Sobre una Nueva Imagen

    Figura 14.5 Figura Sobre una Imagen Existente

  • 7/22/2019 Tema 14 - Imgenes en Java

    9/42

    Tema 14 Imgenes en Java 555

    ITSON Manuel Domitsu Kono

    Entrada / Salida de ImgenesPara cargar imgenes de archivos o guardar imgenes a archivos, Java nos

    proporciona la clase I mageI Oque nos proporciona un conjunto de mtodosestticos para leer y escribir imgenes a archivos. El diagrama de clases de esa

    clase se muestra en la figura 14.6.

    Figura 14.6 Clase ImageIO

    La tabla 14.5 muestra los mtodos de la clase I mageI O.

    Tabla 14.5 Mtodos de la Clase ImageIOpubl i c st ati c Buf f er edI mage read( Fi l e i nput ) t hr ows I OExcept i on

    Regresa un objeto del tipo Buf f eredI magecomo resultado de decodificar el archivo dado por el

    parmetro, usando el objeto del tipo I mageReader seleccionado automaticamente de los

    registrados.

    publ i c st ati c Buf f er edI mage read( I mageI nput St r eam st r eam)t hrows I OExcept i on

    Regresa un objeto del tipo Buf f eredI magecomo resultado de decodificar el objeto del tipoI mageI nput St r eamdado por el parmetro, usando el objeto del tipo I mageReader seleccionado automaticamente de los registrados.publ i c st ati c Buf f er edI mage read( I nput St r eami nput ) t hr ows I OExcept i on

    Regresa un objeto del tipo Buf f eredI magecomo resultado de decodificar el objeto del tipoI nput St r eamdado por el parmetro, usando el objeto del tipo I mageReader seleccionadoautomaticamente de los registrados.publ i c st ati c Buf f er edI mage read( URL i nput ) t hr ows I OExcept i on

    Regresa un objeto del tipo Buf f eredI magecomo resultado de decodificar el objeto del tipo URLdado por el parmetro, usando el objeto del tipo I mageReader seleccionado automaticamente delos registrados.publ i c stat i c bool ean write( Render edI mage i m, St r i ng f ormat Name,

    Fi l e out put ) t hr ows I OExcept i on

    Escribe la imagen del parmetro i mcon el formato dado por f or mat Nameal archivo dado poroutput .

  • 7/22/2019 Tema 14 - Imgenes en Java

    10/42

    556 Imgenes en Java

    ITSON Manuel Domitsu Kono

    Tabla 14.5 Mtodos de la Clase ImageIO. cont.publ i c stat i c bool ean write( Render edI mage i m, St r i ng f ormat Name,

    I mageOut put St r eam out put ) t hr ows I OExcept i on

    Escribe la imagen del parmetro i mcon el formato dado por f or mat Nameal archivo, usando elobjeto del tipo ImageOutputStream.

    publ i c stat i c bool ean write( Render edI mage i m, St r i ng f ormat Name,I mageOut put St r eam out put ) t hr ows I OExcept i on

    Escribe la imagen del parmetro i mcon el formato dado por f or mat Nameal archivo, usando elobjeto del tipo OutputStream.

    Como ejemplo de entrada / salida de imgenes se tiene un programa con una

    interfaz de usuario grfica. El programa permitir leer y guardar imgenes as

    como procesar esas imgenes. La opcin para leer una imagen de un archivo se

    muestra en la figura 14.7. Al seleccionar esa opcin se despliega un cuadro de

    dilogo para seleccionar el nombre del archivo con la imagen a leer, figuras 14.8 y

    14.9.

    Figura 14.7

  • 7/22/2019 Tema 14 - Imgenes en Java

    11/42

    Tema 14 Imgenes en Java 557

    ITSON Manuel Domitsu Kono

    Figura 14.8

    Figura 14.9

    El cdigo que permite leer una imagen de un archivo es el siguiente:

  • 7/22/2019 Tema 14 - Imgenes en Java

    12/42

    558 Imgenes en Java

    ITSON Manuel Domitsu Kono

    / * ** Est e met odo l ee una i magen bmp, gi f , j pg, png y l a* guarda en el at r i but o dbi del t i po Buf f er edI mage

    * @par am f r ame Vent ana sobr e l a que se despl i ega el cuadro* de di al ogo J Fi l eChooser*/

    publ i c voi d l eeI magen( J Fr ame f r ame) {J Fi l eChooser f c = new J Fi l eChooser ( ) ;/ / El i mi na el f i l t r o * . *f c . set Accept Al l Fi l eFi l t erUsed( f al se) ;/ / Cr ea el f i l t r o par a l as ext enci ones val i das

    Fi l eNameExtensi onFi l t er extFi l t r o = new Fi l eNameExtensi onFi l t er ("I mages", "bmp", "gi f ", "j pg", "png") ;

    / / Est abl ece el f i l t r o par a l as ext enci ones val i dasf c. setF i l eFi l ter ( extF i l t r o) ;/ / Despl i ega el cuadr o de di al ogo para sel ecci onar l a i magen a/ / abr i ri nt r et ur nVal = f c. showOpenDi al og( f r ame) ;/ / Si se sel ecci ono una i mageni f ( r etur nVal == J Fi l eChooser . APPROVE_OPTI ON) {

    / / Obt i ene el obj et o Fi l e de l a i magen sel ecci onadaf i l e = f c. get Sel ect edFi l e( ) ;

    try {/ / l ee l a i magen y l a guar da en el at r i but o obi/ / del t i po Buf f er edI mageobi = I mageI O. r ead( f i l e) ;

    / / Hace que l a r ef er enci a dbi apunt e a obi

    dbi = obi ;} catch ( I OExcept i on e) {J Opt i onPane. showMessageDi al og( f r ame,

    "Er r or al car gar i magen") ;return;

    }}

    }

    La opcin para guardar una imagen de un archivo se muestra en la figura 14.7. Al

    seleccionar esa opcin se despliega un cuadro de dilogo para seleccionar el

    nombre del archivo en el que se guardar la imagen, figuras 14.10.

  • 7/22/2019 Tema 14 - Imgenes en Java

    13/42

    Tema 14 Imgenes en Java 559

    ITSON Manuel Domitsu Kono

    Figura 14.10

    El cdigo que permite guardar una imagen a un archivo es el siguiente:

    / * ** Est e metodo guarda l a i magen bmp, gi f , j pg, png del

    * at r i but o bi del t i po Buf f er edI mage en un ar chi vo* @par am f r ame Vent ana sobr e l a que se despl i ega el cuadro* de di al ogo J Fi l eChooser*/

    publ i c voi d Guar daI magenComo( J Fr ame f r ame) {Fi l e f i l eSel = nul l ;

    J Fi l eChooser f c = new J Fi l eChooser ( ) ;/ / El i mi na el f i l t r o * . *f c . set Accept Al l Fi l eFi l t erUsed( f al se) ;/ / Agr ega var i os f i l t r os de i magenesf c. addChoosabl eFi l eFi l t er (

    new Fi l eNameExt ensi onFi l t er( " I magen BMP", "bmp" ) ) ;f c. addChoosabl eFi l eFi l t er (

    new Fi l eNameExtensi onFi l t er ( "I magen GI F", "gi f " ) ) ;f c. addChoosabl eFi l eFi l t er (

    new Fi l eNameExtensi onFi l t er ( "I magen J PG", "j pg" ) ) ;f c. addChoosabl eFi l eFi l t er (

    new Fi l eNameExtensi onFi l t er ( " I magen PNG", "png" ) ) ;/ / Est abl ece el nombr e i ni ci al de l a i magen

  • 7/22/2019 Tema 14 - Imgenes en Java

    14/42

    560 Imgenes en Java

    ITSON Manuel Domitsu Kono

    f c. setSel ect edFi l e( f i l e) ;

    / / Despl i ega cuadr o de di al ogo para obt ener el nombr e

    / / del archi vo en el que se va a guardar l a i mageni nt r et ur nVal = f c. showSaveDi al og( f r ame) ;i f ( r etur nVal == J Fi l eChooser . APPROVE_OPTI ON) {

    St r i ng nombr eExt = nul l ;

    / / Obt i ene el nombr e del archi vo sel ecci onadof i l eSel = f c. get Sel ectedFi l e( ) ;/ / Obt i ene el nombr e del f i l t r o sel ecci onado

    Fi l eNameExt ensi onFi l t er ext Fi l t r o =( Fi l eNameExt ensi onFi l t er ) f c. get Fi l eFi l t er( ) ;

    / / Obt i ene l a extensi on del nombr e del f i l t r o sel ecci onadoSt r i ng ext = ext Fi l t r o. get Ext ensi ons( ) [ 0] ;

    St r i ng pat h = f i l eSel . get Pat h( ) ;

    / / Obt i ene l a ext ensi on del nombr e del archi vo sel ecci onadonombr eExt = get Extensi on( f i l eSel ) ;

    / / Si el nombre sel ecci onado no corr esponde a uno de i mageni f ( nombr eExt ! = nul l && ! esI mageExt ensi on( nombreExt ) ) {

    J Opt i onPane. showMessageDi al og( f r ame,"No es un archi vo de i magen") ;

    return;}

    / / Si no hay extensi on del nombr e del archi vo sel ecci onado

    i f ( nombreExt == nul l ) {/ / Agr egal e l a ext ensi on del nombr e del f i l t r o/ / sel ecci onadopat h += " . " + ext ;f i l eSel = new Fi l e( pat h) ;nombreExt = ext ;

    }

    try {/ / Guarda l a i magenI mageI O. wr i t e( bi , nombr eExt , f i l eSel ) ;

    } catch ( I OExcept i on e) {

    J Opt i onPane. showMessageDi al og( f r ame,"Er r or al guar dar l a i magen") ;

    }

    }}

    / *** Est e met odo despl i ega l a i magen del at r i but o bi

  • 7/22/2019 Tema 14 - Imgenes en Java

    15/42

    Tema 14 Imgenes en Java 561

    ITSON Manuel Domitsu Kono

    * del t i po Buf f er edI mage sobr e el panel l i enzo* @paraml i enzo Panel sobr e el que se despl i ega l a i magen*/

    publ i c voi d despl i egai magen( J Panel l i enzo) {

    / / Obt i ene el t amao de l a i magen

    i nt al t oI magen = bi . get Hei ght ( ) ;i nt anchoI magen = bi . get Wi dt h( ) ;

    l i enzo. setPref er r edSi ze(new Di mensi on( al t oI magen, anchoI magen) ) ;l i enzo. reval i dat e( ) ;

    Gr aphi cs g = l i enzo. get Gr aphi cs( ) ;Gr aphi cs2D g2 = ( Gr aphi cs2D) g;

    g2. dr awI mage( bi , nul l , 1, 1) ;}

    / * ** Est e met odo est at i co borr a el cont eni do del panel de

    * su paramet r o* un conj unt o de l i neas* @param l i enzo Panel a borr ar*/

    publ i c voi d bor r a( J Panel l i enzo) {/ / Obt i ene un obj et o de t i po Gr aphi cs del panel Li enzoGr aphi cs g = l i enzo. get Gr aphi cs( ) ;

    / / Al i nvocar al met odo pai nt se borr a su cont eni do

    l i enzo. pai nt ( g) ;}

    / * ** Est e met odo est at i co obt i ene l a extensi on de un ar chi vo* @param f i l e Obj et o de t i po Fi l e de l a que se obt i ene* l a extensi on

    * @r et urn Ext ensi on de un archi vo*/

    publ i c st at i c St r i ng get Ext ensi on( Fi l e f i l e) {St r i ng ext = nul l ;/ / Obt i ene el nombr e del archi vo

    St r i ng s = f i l e. get Name( ) ;/ / busca el separador de l a ext ensi oni nt pos = s . l ast I ndexOf ( ' . ' ) ;

    / / Si hay un punt o en el nombre y hay una/ / extensi on despues del punt oi f ( pos > 0 && pos < s. l engt h( ) - 1) {

    ext = s. subst r i ng( pos + 1) . t oLower Case( ) ;

  • 7/22/2019 Tema 14 - Imgenes en Java

    16/42

    562 Imgenes en Java

    ITSON Manuel Domitsu Kono

    }r et ur n ext ;

    }

    / * ** Est e medodo determi na si l a ext ensi on del nombre de ar chi vo

    * cor r espont e a una i magen* @par am ext Ext ensi on del nombre de ar chi vo* @r etur n t r ue si si l a extensi on del nombr e de ar chi vo* cor r espont e a una i magen, f al se en caso cont r ari o*/

    publ i c bool ean esI mageExt ensi on( St r i ng ext ) {St r i ng[ ] i magenesExt = {"bmp", "gi f " , "j pg", "png"};

    f or( i nt i = 0; i < i magenesExt. l engt h; i ++) {i f ( ext . equal s( i magenesExt [ i ] ) ) r et ur n t r ue;

    }

    return f al se;}

    }

    Procesamiento de Imgenes

    El procesamiento de imgenes describe la forma de manipular matemticamente

    las imgenes. Procesar una imagen consiste en calcular un nuevo coor para cada

    pixel de una imagen. Ese nuevo color puede depender del color actual del pixel,

    del color de los pixeles vecinos, de otros parmetros o una combinacin de losanteriores.

    El API 2D de Java nos permite una forma sencilla de procesar imgenes basada

    en la clase Buf f eredI magey un conjunto de operaciones representadas en la

    interfaz Buf f eredI mageOp. Las clases que implementan esta interfaz saben

    como procesar una imagen del tipo Buf f eredI mage, llamada imagen fuente para

    producir una nueva imagen llamada imagen destino. Este proceso se muestra en

    la figura 14.11.

    Figura 14.11.

  • 7/22/2019 Tema 14 - Imgenes en Java

    17/42

    Tema 14 Imgenes en Java 563

    ITSON Manuel Domitsu Kono

    Con la API 2D de Java, el procesamiento de imgenes es un procedimiento de

    dos pasos:

    1. Instance la clase que represente la operacin a realizar.

    2. Invoque a su mtodo f i l t er ( ) con la imagen como parmetro.

    La interfaz Buf f eredI mageOp, las clases que implementan los mtodos de la

    interfaz y las clases que las soportan se muestran en la figura 14.12.

    Figura 14.11.

    Las operaciones que realizan las clases que implementan la interfaz

    Buf f eredI mageOpse muestran en la tabla 14.6.

    Tabla 14.6. Operaciones de Procesamiento de Imgenes

    Clase Operacin

    Convol veOp Convolucin: Suavizado, intensificado, deteccin de orillas.LookupOp Tabla de bsquedas: Posterizar, binarizar.Col orConvert Op Conversin de colores: Convertir a tonos de grises.Rescal eOp Reescalar colores: Aclarar, oscurecer.Af f i neTransf ormOp Transformar: Escalar, rotar.

  • 7/22/2019 Tema 14 - Imgenes en Java

    18/42

    564 Imgenes en Java

    ITSON Manuel Domitsu Kono

    ConvolucinUna operacin de convolucin permite combinar el color de un pixel origen con los

    pixeles de sus vecinos para producir un pixel destino. Esa combinacin se

    especifica mediante un operador lineal llamado kernel (ncleo) que determina la

    proporcin de cada pixel de origena usarce para calcular el pixel destino. Unkernel es una matriz donde el centro de la matriz representa el pixel origen y los

    otros elementos sus vecinos. El color destino se calcula multiplicando cada color

    pixel por su correspondiente coeficiente del kernel y sumndolos, figura 14.12.

    La clase Kernel representa un kernel. Para construir un kernel podemos usar el

    constructor de la tabla 14.7.

    Figura 14.12. Convolucin de un Solo Pixel.

    Tabla 14.7 Constructor de la clase Kernel.

    publ i c Kernel( i nt wi dt h, i nt hei ght , f l oat [ ] dat a)

    Construye un kernel a partir del arreglo de nmeros flotantes dados por el parmetro data. Las

    dimensiones del kernel estn dados por los parmetros wi dt h, hei ght .

    En un kernel, la suma de todos sus elementos debe ser 1.0. Si es mayor la imagen

    resultante ser ms clara. Si es menor, ser ms oscura.

    La operacin de convolucin est representada por la clase Convol veOp. Los

    mtodos de la clase Convol veOpse muestran en la tabla 14.8.

    Tabla 14.8 Mtodos de la clase ConvolveOp.publ i c ConvolveOp( Ker nel ker nel )publ i c ConvolveOp( Ker nel ker nel , i nt edgeCondi t i on, Render i ngHi nt s hi nt s)

    Construye un objeto del tipo Convol veOpa partir de un kernel o un kernel, una constante que

    represente una condicinde orilla y una sugerencia de despliegue, la cual puede ser nula.

  • 7/22/2019 Tema 14 - Imgenes en Java

    19/42

    Tema 14 Imgenes en Java 565

    ITSON Manuel Domitsu Kono

    Tabla 14.8 Mtodos de la c lase ConvolveOp. Cont.

    publ i c f i nal Buf f er edI mage filter( Buf f er edI mage sr c, Buf f er edI mage dst )

    Realiza la operacin de convolucin de la imagen bufereada dada por el parmetro sr c. Cadacomponente de la imagen ser convolucionado (incluyendo la componente alfa, si estnpresente). Si el modelo de color de la imagen fuente no es el mismo del de la imagen destino, el

    modelo de color ser convertido al de la imagen destino. Si el parmetro dst es null, se crearuna nueva imagen con el modelo de color de la imagen fuente.

    El parmetro edgeCondi t i onestablece la forma en que se calculan los colores

    de los pixeles de la orilla de la imagen destino.

    Tabla 14.9. Tipos de Condic iones de Orilla

    Tipo DescripcinEDGE_ZERO_FILL Los pixeles en las orillas de la imagen destino se establecen a cero.

    Este es el valor por ausencia.

    EDGE_NO_OP Los pixeles en las orillas de la imagen fuente son copiados a sus

    correspondientes pixeles en la imagen destino sin modificacin.

    Suavizado de Imgenes

    Una de las operaciones de convolucin es el suavizado. En esta operacin el color

    de un pixel destino es el promedio de su correspondiente pixel origen con sus

    pixeles vecinos. Este tipo de filtrado es til para reducir el ruido de las imgenes.

    El siguiente cdigo muestra la implementacin de un filtro suavizador.

    / * ** Est e met odo suavi za una i magen* @par am f r ame Vent ana sobr e l a que se despl i ega el mensaj e de er r or

    */publ i c voi d suavi za( J Frame f r ame) {

    / / ver i f i ca que haya una i magen l i st a para ser procesadai f ( ! pr epar aI magenPr ocesar ( f r ame) )

    return;

    / / Def i ne un ker nel suavi zadorf l oat ni nt h = 1. 0f / 9. 0f ;

    f l oat [ ] bl ur Ker nel = {ni nt h, ni nt h, ni nt h,ni nt h, ni nt h, ni nt h,ni nt h, ni nt h, ni nt h

    };

    / / crea una oper aci n de convol uci n a part i r del ker nelConvol veOp op = new Convol veOp(new Kernel ( 3, 3, bl urKernel ) ) ;

  • 7/22/2019 Tema 14 - Imgenes en Java

    20/42

    566 Imgenes en Java

    ITSON Manuel Domitsu Kono

    / / Fi l t r a l a i magen usando l a oper aci onpbi = op. f i l ter ( pbi , nul l ) ;

    / / Hace que l a r ef er enci a dbi apunt e a obidbi = pbi ;

    }

    / * ** Est e metodo ver i f i ca que haya una i magen l i st a para ser pr ocesada* @par am f r ame Vent ana sobr e l a que se despl i ega el mensaj e de er r or

    */pri vat e bool ean pr eparaI magenProcesar ( J Fr ame f r ame) {

    / / Si no hay se ha cr eado una i magen vaci a o se ha/ / cargado una i magen desde un archi voi f ( obi == nul l ) {

    J Opt i onPane. showMessageDi al og( f r ame,"No hay una i magen par a pr ocesar" ) ;

    return f al se;}

    / / Si no hay una i magen a pr ocesari f ( pbi == nul l ) {

    / / Cr ea una copi a de l a i magen ori gi nal y l a asi gna a l a/ / i magen a pr ocesarpbi = obi . get Subi mage( 0, 0, obi . get Wi dt h( ) , obi . get Hei ght ( ) ) ;

    / / Obt i ene el t amao de l a i magen

    i nt al t oI magen = pbi . get Hei ght ( ) ;

    i nt anchoI magen = pbi . getWi dt h( ) ;

    / / Convi ert e l a i magen a una i magen RGB nor mal i zadapbi = new Buf f eredI mage( anchoI magen, al t oI magen,

    Buf f eredI mage. TYPE_I NT_RGB) ;Gr aphi cs2D g2 = pbi . cr eateGr aphi cs( ) ;g2. dr awI mage( dbi , nul l , 0, 0) ;

    }

    r et ur n t r ue;}

    La figura 14.13 muestra la imagen original y la imagen suavizada.

  • 7/22/2019 Tema 14 - Imgenes en Java

    21/42

    Tema 14 Imgenes en Java 567

    ITSON Manuel Domitsu Kono

    Figura 14.13. Filt ro Suavizador. Izquierda: Imagen orig inal, derecha: Imagen

    Suavizada.

    Intensificado de Imgenes

    Otra de las operaciones de convolucin es el intensificado. En esta operacin se

    busca resaltar el cambio en los colores de los pixeles, manteniendo los colores

    originales.

    El siguiente cdigo muestra la implementacin de un filtro intensificador.

    / * ** Est e metodo i nt ensi f i ca una i magen* @par am f r ame Vent ana sobr e l a que se despl i ega el mensaj e de er r or

    */publ i c voi d i nt ensi f i ca( J Frame f r ame) {

    / / ver i f i ca que haya una i magen l i st a para ser procesadai f ( ! pr epar aI magenPr ocesar ( f r ame) )

    return;

    / / Def i ne un ker nel i nt ensi f i cadorf l oat [ ] shar pKer nel = {0 .0 f , - 1 .0 f , 0 .0 f ,- 1. 0f , 5. 0f , - 1. 0f ,0. 0f , - 1. 0f , 0. 0f

    };

    / / crea una oper aci n de convol uci n a part i r del ker nel

    Convol veOp op = new Convol veOp(new Kernel ( 3, 3, sharpKernel ) ) ;

  • 7/22/2019 Tema 14 - Imgenes en Java

    22/42

    568 Imgenes en Java

    ITSON Manuel Domitsu Kono

    / / Fi l t r a l a i magen usando l a oper aci onpbi = op. f i l ter ( pbi , nul l ) ;

    / / Hace que l a r ef er enci a dbi apunt e a obidbi = pbi ;

    }

    La figura 14.14 muestra la imagen original y la imagen intensificada.

    Figura 14.14. Filtro Intensificador. Izquierda: Imagen original, derecha:Imagen Intensificada.

    Deteccin de Orillas

    Otra operacin de convolucin muy empleada es la de deteccin de orillas. En

    esta operacin se busca resaltar el cambio brusco en los colores de los pixeles.

    El siguiente cdigo muestra la implementacin de un filtro detector de orillas.

    / * ** Est e metodo detecta l as ori l l as de una i magen* @par am f r ame Vent ana sobr e l a que se despl i ega el mensaj e de er r or

    */publ i c voi d det ect or Or i l l as( J Frame f r ame) {

    / / ver i f i ca que haya una i magen l i st a para ser procesadai f ( ! pr epar aI magenPr ocesar ( f r ame) )

    return;

  • 7/22/2019 Tema 14 - Imgenes en Java

    23/42

    Tema 14 Imgenes en Java 569

    ITSON Manuel Domitsu Kono

    / / Def i ne un ker nel det ect or de or i l l asf l oat [ ] edgeKer nel = {

    0 .0 f , - 1 .0 f , 0 .0 f ,- 1. 0f , 4. 0f , - 1. 0f ,0. 0f , - 1. 0f , 0. 0f

    };

    / / crea una oper aci n de convol uci n a part i r del ker nelConvol veOp op = new Convol veOp( new Ker nel ( 3, 3, edgeKernel ) ) ;

    / / Fi l t r a l a i magen usando l a oper aci onpbi = op. f i l ter ( pbi , nul l ) ;

    / / Hace que l a r ef er enci a dbi apunt e a obidbi = pbi ;

    }

    La figura 14.15 muestra la imagen original y la imagen con las orillas detectadas.

    Figura 14.15. Filtro Detector de Orillas. Izquierda: Imagen original, derecha:

    Imagen Filtrada.

    Tablas de Bsqueda

    Otra operacin sobre las imgenes utiliza una tabla de bsqueda. En esta

    operacin, los pixeles de la imagen fuente se transforman a los pixeles de la

    imagen destino mediante el uso de una tabla. Tres tablas con 256 entradas cada

  • 7/22/2019 Tema 14 - Imgenes en Java

    24/42

    570 Imgenes en Java

    ITSON Manuel Domitsu Kono

    una son suficientes para transformar una imagen de color origen a una imagen de

    color destino. El valor de cada color de un pixel en la imagen origen se utiliza

    como ndice en su correspondiente tabla para obtener el valor del pixel de la

    imagen destino.

    Se puede utilizar una tabla para cada color, o la misma tabla para los tres colores.

    Cada tabla est encapsulada por la clase abstracta LookupTabl ey sus

    implementaciones Byt eLookupTabl ey Shor t LookupTabl e, que contienen

    arreglos de bytes y enteros cortos, respectivamente. Para construir tablas de

    bsqueda se tienen los constructores de las tablas 14.10.

    Tabla 14.10 Constructores de las clases ByteLookupTabley

    ShortLookupTable

    publ i c ByteLookupTable( i nt of f set , byt e[ ] dat a)

    Construye un objeto del tipo Byt eLookupTabl edel arreglo de bytes del parmetro dataque

    representa una tabla de bsqueda que se aplicar a todas las bandas. El valor del parmetro

    offset se le quitar a los valores de entrada antes de usarlos como ndices al arreglo.

    publ i c ByteLookupTable( i nt of f set , byt e[ ] [ ] dat a)

    Construye un objeto del tipo Byt eLookupTabl edel arreglo de arreglos de bytes del parmetro

    dataque representan una tabla de bsqueda para cada banda. El valor del parmetro of f set

    se le quitar a los valores de entrada antes de usarlos como ndices a los arreglos. El nmero de

    bandas es es la longitud del parmetro data.

    publ i c ShortLookupTable( i nt of f set , short [ ] dat a)

    Construye un objeto del tipo Shor t LookupTabl edel arreglo de enteros cortos del parmetrodataque representa una tabla de bsqueda que se aplicar a todas las bandas. El valor del

    parmetro offset se le quitar a los valores de entrada antes de usarlos como ndices al

    arreglo.

    publ i c ShortLookupTable( i nt of f set , shor t [ ] [ ] data)

    Construye un objeto del tipo Shor t LookupTabl edel arreglo de arreglos de bytes del parmetro

    dataque representan una tabla de bsqueda para cada banda. El valor del parmetro of f set

    se le quitar a los valores de entrada antes de usarlos como ndices a los arreglos. El nmero de

    bandas es es la longitud del parmetro data.

    La operacin usando tablas de bsqueda est representada por la claseLookUpOp. Los mtodos de la clase LookUpOpse muestran en la tabla 14.11.

  • 7/22/2019 Tema 14 - Imgenes en Java

    25/42

    Tema 14 Imgenes en Java 571

    ITSON Manuel Domitsu Kono

    Tabla 14.11 Mtodos de la clase LookUpOp.

    publ i c LookUpOp( ByteLookupTable t abl e, Render i ngHi nt s hi nt s)publ i c LookUpOp( ShortLookupTable t abl e, Render i ngHi nt s hi nt s)

    Construye un objeto del tipo LookUpOpa partir de una tabla de bsqueda y una sugerencia de

    despliegue, la cual puede ser nula.

    publ i c f i nal Buf f er edI mage filter( Buf f er edI mage sr c, Buf f er edI mage dst )

    Realiza la operacin de filtrado usando una tabla de bsqueda de de la imagen bufereada dadapor el parmetro sr c. Si el modelo de color de la imagen fuente no es el mismo del de la imagendestino, el modelo de color ser convertido al de la imagen destino. Si el parmetro dst es null,se crear una nueva imagen con el modelo de color de la imagen fuente.

    Negativo de Imgenes

    Una de las operaciones usando tablas de bsqueda es la inversin de colores. En

    esta operacin el color de un pixel destino se obtiene restndole a 255, el valor de

    su correspondiente pixel origen. La imagen resultante luce como el negativo de

    color de una pelcula convencional.

    El siguiente cdigo muestra la implementacin de un filtro inversor de colores.

    / * ** Est e met odo i nvi er t e l os col ores de l os pi xel es de una i mage,* haci endo l os pi xel es cl ar os oscur os y vi cever sa.* @par am f r ame Vent ana sobr e l a que se despl i ega el mensaj e de er r or

    */publ i c voi d i nver t i r ( J Frame f r ame) {

    / / ver i f i ca que haya una i magen l i st a para ser procesadai f ( ! pr epar aI magenPr ocesar ( f r ame) )

    return;

    / / Def i ne una t abl a de busqueda par a i nver t i r l os t r es canal es./ / Se apl i ca l a mi sma tabl a par a l os t r es canal esshor t [ ] i nver t = new shor t [ 256] ;f or ( i nt i = 0; i < 256; i ++) {

    i nvert [ i ] = ( short ) ( 255 - i ) ;}LookupTabl e t abl e = new Shor t LookupTabl e(0, i nver t ) ;

    / / cr ea una oper aci n de busqueda a part i r de l a t abl aLookupOp op = new LookupOp( t abl e, nul l ) ;

    / / Fi l t r a l a i magen usando l a oper aci onpbi = op. f i l ter ( pbi , nul l ) ;

    / / Hace que l a r ef er enci a dbi apunt e a obidbi = pbi ;

    }

    La figura 14.16 muestra la imagen original y la imagen con los colores invertidos.

  • 7/22/2019 Tema 14 - Imgenes en Java

    26/42

    572 Imgenes en Java

    ITSON Manuel Domitsu Kono

    Figura 14.16. Inversin de colores. Izquierda: Imagen original, derecha:

    Imagen Negativa.

    En el siguiente cdigo se muestra una tabla de bsqueda en la que se tiene unatabla para cada canal. La operacin elimina la componente verde de la imagenhaciendo ceros todos los elementos del arreglo asociado a la banda verde.

    / * ** Est e met odo el i mi na l a component e ver de de una i magen.* @par am f r ame Vent ana sobr e l a que se despl i ega el mensaj e de er r or

    */publ i c voi d el i mi narVer des( J Frame f r ame) {

    / / ver i f i ca que haya una i magen l i st a para ser procesadai f ( ! pr epar aI magenPr ocesar ( f r ame) )

    return;

    / / Def i ne una t abl a de busqueda para el i mi nar l a component e/ / ver de de l a i magen. Se apl i can t abl a di f er ent es par a l os/ / canal esshor t [ ] zero = new shor t [ 256] ;shor t [ ] st r ai ght = new short [ 256] ;f or ( i nt i = 0; i < 256; i ++) {

    zer o[ i ] = ( short ) 0;

    s t rai ght [ i ] = (shor t ) i ;}shor t [ ] [ ] gr eenRemove = {st r ai ght , zer o, st r ai ght };LookupTabl e t abl e = new Shor t LookupTabl e( 0, greenRemove) ;

    / / cr ea una oper aci n de busqueda a part i r de l a t abl aLookupOp op = new LookupOp( t abl e, nul l ) ;

    / / Fi l t r a l a i magen usando l a oper aci onpbi = op. f i l ter ( pbi , nul l ) ;

  • 7/22/2019 Tema 14 - Imgenes en Java

    27/42

    Tema 14 Imgenes en Java 573

    ITSON Manuel Domitsu Kono

    / / Hace que l a r ef er enci a dbi apunt e a obidbi = pbi ;

    }

    La figura 14.17 muestra la imagen original y la imagen con los colores verdes

    removidos.

    Figura 14.17. Remocin de colores. Izquierda: Imagen original, derecha:

    Imagen con los colores verdes removidos.

    Aclarado de Imgenes Usando un Mapeado Lineal

    Otro tipo de operacin usando tablas de bsqueda es la que nos permite aclarar o

    aumentar la brillantez de una imagen usando un mapeado lineal. En esta

    operacin el rango completo de valores de un color (0 a 255) se mapean a un

    rango menor (digamos de 128 a 255). La figura 14.18 muestra esa relacin.

    Figura 14.18. Abrillantando una imagen con un mapeo lineal.

  • 7/22/2019 Tema 14 - Imgenes en Java

    28/42

    574 Imgenes en Java

    ITSON Manuel Domitsu Kono

    El siguiente cdigo muestra la implementacin de un filtro aclarador lineal.

    / * ** Est e met odo aument a l a br i l l ant ez de una i magen* ut i l i zando una t r ansf or maci on l i neal .* @par am f r ame Vent ana sobr e l a que se despl i ega el mensaj e de er r or

    */publ i c voi d acl aradoLi neal ( J Frame f r ame) {

    / / ver i f i ca que haya una i magen l i st a para ser procesadai f ( ! pr epar aI magenPr ocesar ( f r ame) )

    return;

    / / Def i ne una tabl a de busqueda para aument ar l a/ / br i l l ant ez de una i magen usando una t r ansf ormaci on/ / l i nealshor t [ ] br i ght en = new short [ 256] ;f or ( i nt i = 0; i < 256; i ++) {

    br i ght en[ i ] = ( shor t ) ( 128 + i / 2) ;

    }LookupTabl e tabl e = new Shor t LookupTabl e(0, bri ght en) ;

    / / cr ea una oper aci n de busqueda a part i r de l a t abl aLookupOp op = new LookupOp( t abl e, nul l ) ;

    / / Fi l t r a l a i magen usando l a oper aci onpbi = op. f i l ter ( pbi , nul l ) ;

    / / Hace que l a r ef er enci a dbi apunt e a obidbi = pbi ;

    }

    La figura 14.19 muestra la imagen original y la imagen aclarada usando un mapeolineal.

  • 7/22/2019 Tema 14 - Imgenes en Java

    29/42

    Tema 14 Imgenes en Java 575

    ITSON Manuel Domitsu Kono

    Figura 14.19. Abrillantando una imagen con un mapeo lineal. Izquierda:

    Imagen original, derecha: Imagen aclarada.

    Aclarado de Imgenes Usando un Mapeado Raz Cuadrtica

    El abrillantado de imgenes usando un mapeo lineal, produce imgenes que

    aparecen deslavadas. Otro tipo de operacin de abrillantado, utiliza una funcin

    raz cuadrada, como se muestra en la figura 14.20. El efecto producido es el de

    aclarar ms el rango medio de los valores de entrada que los valores en el tope y

    en el fondo.

    Figura 14.20. Abrillantando una imagen con un mapeo raz cuadrtica.

    El siguiente cdigo muestra la implementacin de un filtro aclarador raz

    cuadrtica.

  • 7/22/2019 Tema 14 - Imgenes en Java

    30/42

    576 Imgenes en Java

    ITSON Manuel Domitsu Kono

    / * ** Est e met odo aument a l a br i l l ant ez de una i magen* ut i l i zando una tr ansf or maci on r ai z cuadr at i ca.* @par am f r ame Vent ana sobr e l a que se despl i ega el mensaj e de er r or

    */publ i c voi d acl aradoRai z( J Frame f r ame) {

    / / ver i f i ca que haya una i magen l i st a para ser procesadai f ( ! pr epar aI magenPr ocesar ( f r ame) )

    return;

    / / Def i ne una tabl a de busqueda para aument ar l a/ / br i l l ant ez de una i magen usando una t r ansf ormaci on/ / rai z cuadrat i ca.shor t [ ] r oot Br i ght en = new shor t [ 256] ;f or ( i nt i = 0; i < 256; i ++) {

    r oot Br i ght en[ i ] = ( shor t ) ( Mat h. sqr t ( ( doubl e) i / 255. 0)* 255. 0) ;

    }LookupTabl e t abl e = new Shor t LookupTabl e(0, r oot Br i ght en) ;

    / / cr ea una oper aci n de busqueda a part i r de l a t abl aLookupOp op = new LookupOp( t abl e, nul l ) ;

    / / Fi l t r a l a i magen usando l a oper aci onpbi = op. f i l ter ( pbi , nul l ) ;

    / / Hace que l a r ef er enci a dbi apunt e a obidbi = pbi ;

    }

    La figura 14.21 muestra la imagen original y la imagen aclarada usando un mapeo

    raz cuadrtica.

    Posterizacin

    El efecto de posterizacin es la reduccin del nmero de colores usados para

    desplegar una imagen. Para ello podemos usar una tabla de bsqueda que mapea

    valores de entrada a un conjunto pequeo de valores de salida.

    El siguiente cdigo muestra la implementacin de un filtro posterizador.

  • 7/22/2019 Tema 14 - Imgenes en Java

    31/42

    Tema 14 Imgenes en Java 577

    ITSON Manuel Domitsu Kono

    Figura 14.21. Abrillantando una imagen con un mapeo raz cuadrtica.Izquierda: Imagen original, derecha: Imagen aclarada.

    / * ** Est e met odo r educe el maxi mo numero de col or es de* 2 24 = 16777216 a 2 9 = 256.* @par am f r ame Vent ana sobr e l a que se despl i ega el mensaj e de er r or

    */publ i c voi d post er i zar( J Frame f r ame) {

    / / ver i f i ca que haya una i magen l i st a para ser procesadai f ( ! pr epar aI magenPr ocesar ( f r ame) )

    return;

    / / Def i ne una t abl a de busqueda para r educi r el maxi mo/ / numer o de col or es de 2 24 = 16777216 a 2 9 = 256.shor t [ ] post er i ze = new shor t [ 256] ;f or ( i nt i = 0; i < 256; i ++) {

    poster i ze[ i ] = (shor t ) ( i - ( i % 32)) ;}LookupTabl e t abl e = new Shor t LookupTabl e(0, post er i ze) ;

    / / cr ea una oper aci n de busqueda a part i r de l a t abl aLookupOp op = new LookupOp( t abl e, nul l ) ;

    / / Fi l t r a l a i magen usando l a oper aci onpbi = op. f i l ter ( pbi , nul l ) ;

    / / Hace que l a r ef er enci a dbi apunt e a obidbi = pbi ;

    }

    La figura 14.22 muestra la imagen original y la imagen posterizada.

  • 7/22/2019 Tema 14 - Imgenes en Java

    32/42

    578 Imgenes en Java

    ITSON Manuel Domitsu Kono

    Figura 14.22. Posterizado de una imagen Izquierda: Imagen or iginal, derecha:Imagen posterizada.

    Binarizado

    En esta operacin, se usan tres valores: un valor lmite, un valor mnimo y un valor

    mximo para controlar de los colores de cada pixel de la imagen. A los valores de

    un color por debajo del lmite se les asigna el valor mnimo. A los valores de un

    color por encima del lmite se les asigna el valor mximo.

    El siguiente cdigo muestra la implementacin de un filtro posterizador con un

    valor mnimo de 0, un valor mximo de 255. Por lo que la imagen resultante

    contendr slo los siguientes 8 colores:

    1. negro (rojo = 0, verde = 0, azul = 0)2. blanco (rojo = 255, verde = 255, azul = 255)3. rojo (rojo = 255, verde = 0, azul = 0)4. verde (rojo = 0, verde = 255, azul = 0)5. azul (rojo = 0, verde = 0, azul = 255)

    6. amarillo (rojo = 255, verde = 255, azul = 0)7. magenta (rojo = 255, verde = 0, azul = 255)8. cian (rojo = 0, verde = 255, azul = 255)

  • 7/22/2019 Tema 14 - Imgenes en Java

    33/42

    Tema 14 Imgenes en Java 579

    ITSON Manuel Domitsu Kono

    / * ** Est e met odo bi nar i za una i magen r educi endo cada banda* de col or a dos posi bl es val ores 0 o 1, r educi endo el* numero de col or es a 2 3 = 8.* @par am f r ame Vent ana sobr e l a que se despl i ega el mensaj e de er r or

    */publ i c voi d bi nari zar ( J Frame f r ame) {

    / / ver i f i ca que haya una i magen l i st a para ser procesadai f ( ! pr epar aI magenPr ocesar ( f r ame) )

    return;

    / / Def i ne una t abl a de busqueda para bi nar i zar una i magenshor t [ ] t hr eshol d = new shor t [ 256] ;f or ( i nt i = 0; i < 256; i ++) {

    t hr eshol d[ i ] = ( i < 128) ? ( shor t ) 0 : ( shor t ) 255;}LookupTabl e tabl e = new Shor t LookupTabl e(0, t hr eshol d) ;

    / / cr ea una oper aci n de busqueda a part i r de l a t abl aLookupOp op = new LookupOp( t abl e, nul l ) ;

    / / Fi l t r a l a i magen usando l a oper aci onpbi = op. f i l ter ( pbi , nul l ) ;

    / / Hace que l a r ef er enci a dbi apunt e a obidbi = pbi ;

    }

    La figura 14.23 muestra la imagen original y la imagen binarizada.

    Figura 14.23. Binarizado de una imagen Izquierda: Imagen original, derecha:Imagen binarizada.

  • 7/22/2019 Tema 14 - Imgenes en Java

    34/42

    580 Imgenes en Java

    ITSON Manuel Domitsu Kono

    Conversin del Espacio de Color

    Esta operacin se utiliza para convertir los colores de un espacio de color a otro.

    Los espacios de color estan representados por la clase Col orSpace. Esta clasedefine una serie de constantes simblicas que representan esos espacios de

    color. Algunas de esas constantes se muestran en la tabla 14.12.

    Tabla 14.12 Espacios de Color

    Constante Descripcin

    CS_GRAY El espacio de color de tonos de grises predefinido.CS_LINEAR_RGB El espacio de color RGB predefinido.TYPE_CMY Cualquiera de los espacios de color CMY.TYPE_CMYK Cualquiera de los espacios de color CMYK.Para obtener una instancia de la clase ColorSpacepodemos utilizar uno de sus

    mtodos get I nst ance( ) cuya sintaxis se muestra en la tabla 14.13.

    Tabla 14.13 Mtodo getInstancede la clase ColorSpace

    publ i c st at i c Col or Space getInstance( i nt col or space)

    Regresa un objeto del tipo Col orSpacerepresentando uno de los espacios de color predefinidos.

    La operacin para convertir los colores de un espacio de color a otro estrepresentada por la clase Col orConver t Op. Los mtodos de la clase

    Col orConver t Opse muestran en la tabla 14.14.

    Tabla 14.14 Mtodos de la clase LookUpOp.

    publ i c ColorConvertOp( Col orSpace cspace, Render i ngHi nt s hi nt s)

    Construye un objeto del tipo Col orConver t Opa partir de un objeto del tipo Col orSpacey una

    sugerencia de despliegue, la cual puede ser nula.

    publ i c f i nal Buf f er edI mage filter( Buf f er edI mage sr c, Buf f er edI mage dst )

    Convierte el espacio de color de de la imagen bufereada dada por el parmetro sr c. Si elparmetro dst es null, se crear una nueva imagen con el modelo de color de la imagen fuente.

    Conversin de una Imagen de Color a Tonos de Grises

    El siguiente cdigo convierte una imagen de color a una de tonos de grises.

  • 7/22/2019 Tema 14 - Imgenes en Java

    35/42

    Tema 14 Imgenes en Java 581

    ITSON Manuel Domitsu Kono

    / * ** Est e metodo convi ert e una i magen de col or a t onos de gr i ses.* @par am f r ame Vent ana sobr e l a que se despl i ega el mensaj e de er r or

    */publ i c voi d t oGr i ses( J Frame f r ame) {

    / / ver i f i ca que haya una i magen l i st a para ser procesadai f ( ! pr epar aI magenPr ocesar ( f r ame) )

    return;

    / / Cr ea una operaci on de conver si on de col ores para cambi ar/ / de col or es a t onos de gr i sesCol orConver t Op op = new Col orConver t Op(Col orSpace.

    get I nst ance( Col orSpace. CS_GRAY) , nul l ) ;

    / / Fi l t r a l a i magen usando l a oper aci onpbi = op. f i l ter ( pbi , nul l ) ;

    / / Hace que l a r ef er enci a dbi apunt e a obidbi = pbi ;

    }

    La figura 14.24 muestra la imagen original y la imagen en tonos de grises.

    Figura 14.24. Izquierda: Imagen original, derecha: Imagen en tonos de grises.

    Reescalamiento de Color

    Esta operacin se utiliza para ajustar la brillantez de una imagen multiplicando

    cada componente de color de cada pixel por un factor de escala.

    La operacin para reescalar la brillantez de una imagen est representada por la

    clase Rescal eOp. La clase soporta un desplazamiento adems del factor de

  • 7/22/2019 Tema 14 - Imgenes en Java

    36/42

    582 Imgenes en Java

    ITSON Manuel Domitsu Kono

    escala. Ese desplazamiento se le agrega al valor de la componente de color

    despus de escalarla. Los mtodos de la clase Col orConver t Opse muestran en

    la tabla 14.15.

    Tabla 14.15 Mtodos de la clase RescaleOp

    publ i c RescaleOp( f l oat scal eFactor , f l oat of f set , Renderi ngHi nt s hi nt s)

    Construye un objeto del tipo Rescal eOpcon el factor de escala y desplazamiento deseados y

    una sugerencia de despliegue, la cual puede ser nula. El mismo escalamiento se aplica a todos

    las bandas de color.

    publ i c RescaleOp( f l oat [ ] scal eFact ors , f l oat [ ] of f set s ,Render i ngHi nt s hi nt s)

    Construye un objeto del tipo RescaleOp con los factores de escala y desplazamientos deseados yuna sugerencia de despliegue, la cual puede ser nula.publ i c f i nal Buf f er edI mage filter( Buf f er edI mage sr c, Buf f er edI mage dst )

    Escala la imagen bufereada dada por el parmetro sr c. Si el parmetro dst es null, se crearuna nueva imagen con el modelo de color de la imagen fuente.

    El siguiente cdigo aumenta la brillantez de una imagen en un 20%.

    / * ** Est e met odo aument a l a br i l l ant ez de una i magen en un 20%,* Haci endo un r eescal ami ent o de col ores.* @par am f r ame Vent ana sobr e l a que se despl i ega el mensaj e de er r or

    */publ i c voi d acl ara( J Frame f r ame) {

    / / ver i f i ca que haya una i magen l i st a para ser procesadai f ( ! pr epar aI magenPr ocesar ( f r ame) )return;

    / / Cr ea una oper aci on de escal ami ent o para acl arar una i magen en/ / 20%

    Rescal eOp op = new Rescal eOp( 1. 2f , 0, nul l ) ;

    / / Fi l t r a l a i magen usando l a oper aci onpbi = op. f i l ter ( pbi , nul l ) ;

    / / Hace que l a r ef er enci a dbi apunt e a obi

    dbi = pbi ;}

    La figura 14.25 muestra la imagen original y la imagen abrillantada un 20%

  • 7/22/2019 Tema 14 - Imgenes en Java

    37/42

    Tema 14 Imgenes en Java 583

    ITSON Manuel Domitsu Kono

    Figura 14.25. Izquierda: Imagen original, derecha: Imagen abril lantada 20%.

    El siguiente cdigo disminuye la brillantez de una imagen en un 20%.

    / * ** Est e met odo di smi nuye l a br i l l ant ez de una i magen en un 20%,

    * Haci endo un r eescal ami ent o de col ores.* @par am f r ame Vent ana sobr e l a que se despl i ega el mensaj e de er r or

    */publ i c voi d oscur ece( J Frame f r ame) {

    / / ver i f i ca que haya una i magen l i st a para ser procesada

    i f ( ! pr epar aI magenPr ocesar ( f r ame) )return;

    / / Cr ea una operaci on de escal ami ent o para oscur ecer una i magen/ / en 20%

    Rescal eOp op = new Rescal eOp( 0. 8f , 0, nul l ) ;

    / / Fi l t r a l a i magen usando l a oper aci onpbi = op. f i l ter ( pbi , nul l ) ;

    / / Hace que l a r ef er enci a dbi apunt e a obidbi = pbi ;

    }

    La figura 14.26 muestra la imagen original y la imagen oscurecida un 20%

  • 7/22/2019 Tema 14 - Imgenes en Java

    38/42

    584 Imgenes en Java

    ITSON Manuel Domitsu Kono

    Figura 14.26. Izquierda: Imagen orig inal, derecha: Imagen oscurecida 20%.

    El siguiente cdigo modifica la brillantez de una imagen, aclarando la banda roja

    un 20 %, oscureciendo la banda azul un 20% y dejando la banda verde sin

    modificar.

    ./ * ** Est e metodo modi f i ca l a br i l l ant ez de cada banda por separado* de una i magen, haci endo r eescal ami ent o de col ores.* @par am f r ame Vent ana sobr e l a que se despl i ega el mensaj e de er r or

    */publ i c voi d aj ust aBr i l l ant ezBandas( J Frame f r ame) {/ / ver i f i ca que haya una i magen l i st a para ser procesadai f ( ! pr epar aI magenPr ocesar ( f r ame) )

    return;

    / / Cr ea una oper aci on de escal ami ent o de col or para acl arar/ / l a banda roj a un 20 % y oscur ecer l a banda azul un 20%/ / dej ando l a banda ver de si n modi f i carRescal eOp op = new Rescal eOp( new f l oat [ ] {1. 2f , 1. 0f , 0. 8f },

    new f l oat [ ] {32. 0f , 0f , 0. 0f }, nul l ) ;

    / / Fi l t r a l a i magen usando l a oper aci onpbi = op. f i l ter ( pbi , nul l ) ;

    / / Hace que l a r ef er enci a dbi apunt e a obidbi = pbi ;

    }

  • 7/22/2019 Tema 14 - Imgenes en Java

    39/42

    Tema 14 Imgenes en Java 585

    ITSON Manuel Domitsu Kono

    La figura 14.27 muestra la imagen original y la imagen con las bandas modificadas

    en su brillantez por separado

    Figura 14.27. Izquierda: Imagen original, derecha: Imagen con las bandasmodif icadas en su bril lantez por separado.

    Transformacin de Imgenes

    Esta operacin transforma una imagen escalandola, rotndola o deformndola.

    Las transformaciones estn representadas por la clase Af f i neTr ansf or m. Estaclase define una serie de mtodos que regresan las diferentes transformaciones.Esos mtodos se muestran en la tabla 14.16.

    Tabla 14.16 Mtodo de la claseAffineTransform

    publ i c stati c Af f i neTransf orm getRotateInstance( doubl e t het a) ;

    Regresa una transformacin que rota la imagen alrededor del origen, el ngulo del parmetro en

    radianes.

    publ i c stati c Af f i neTransf orm getRotateInstance( doubl e t het a,doubl e anchor x, doubl e anchory) ;

    Regresa una transformacin que rota la imagen alrededor de las coordenadas 8x, y), el ngulo del

    parmetro en radianes.

    publ i c stati c Af f i neTransf orm getScaleInstance( doubl e sx, doubl e sy)

    Regresa una transformacin que escala las dimensiones de la imagen en los valores de susparmetros.

  • 7/22/2019 Tema 14 - Imgenes en Java

    40/42

    586 Imgenes en Java

    ITSON Manuel Domitsu Kono

    Tabla 14.16 Mtodo de la claseAffineTransform. cont.

    publ i c stati c Af f i neTransf orm getShearInstance( doubl e shx, doubl e shy)

    Regresa una transformacin que deforma las dimensiones de la imagen en los valores de susparmetros.

    La operacin para transformar una imagen est representada por la clase

    Af f i neTransf ormOp. Los mtodos de la clase Col orConver t Opse muestran

    en la tabla 14.17.

    Tabla 14.17 Mtodos de la c laseAffineTransformOp.

    publ i cAffineTransformOp( Af f i neTr ansf or m xf or m, i nt i nt er pol at i onType)

    Construye un objeto del tipo Af f i neTr ansf or mOp a partir de una transformacin y un t i pode i nt er pol aci n. publ i c Af f i neTr ansf or mOp( Af f i neTr ansf or m xf or m, Render i ngHi nt s hi nt s)

    Construye un objeto del tipo Af f i neTr ansf or mOpa partir de una transformacin y una

    sugerencia de despliegue, la cual puede ser nula.

    publ i c f i nal Buf f er edI mage filter( Buf f er edI mage sr c, Buf f er edI mage dst )

    Transforma la imagen bufereada dada por el parmetro sr c. Si el parmetro dst es null, secrear una nueva imagen con el modelo de color de la imagen fuente.

    La tabla 14.18 muestra las constantes que definen los tipos de interpolaci. Son

    constantes enteras estticas.

    Tabla 14.18 Tipos de interpolacin

    Constante Descripcin

    TYPE_NEAREST_NEIGHBOR Interpolacin del tipo vecino ms cercano..

    TYPE_BILINEAR Interpolacin bilinear

    TYPE_BICUBIC Interpolacin bicbica.

    Escalamiento de una Imagen

    El siguiente cdigo esacala una imagen aumentando su anchura en 20% y

    disminuyendo el alto en 20%

    / * ** Est e met odo aumenta el ancho de una i magen en 20% y di smi nuye* l a al t ur a en 20% haci endo una operaci on de t r ansf ormaci on* @par am f r ame Vent ana sobr e l a que se despl i ega el mensaj e de er r or

    */publ i c voi d escal a( J Frame f r ame) {

    / / ver i f i ca que haya una i magen l i st a para ser procesada

  • 7/22/2019 Tema 14 - Imgenes en Java

    41/42

    Tema 14 Imgenes en Java 587

    ITSON Manuel Domitsu Kono

    i f ( ! pr epar aI magenPr ocesar ( f r ame) )return;

    / / Cr ea una t r ansf ormaci on par a aument ar el ancho de l a i magen/ / en 20% y di smi nui r l a al t ur a en 20%Af f i neTr ansf or m at = Af f i neTr ansf or m. get Scal eI nst ance( 1. 2, 0. 8) ;

    Render i ngHi nts r h = new Render i ngHi nts(Render i ngHi nts. KEY_I NTERPOLATI ON,Render i ngHi nts. VALUE_I NTERPOLATI ON_BI LI NEAR) ;

    Af f i neTr ansf ormOp op = new Af f i neTr ansf ormOp( at , r h) ;

    / / Fi l t r a l a i magen usando l a oper aci onpbi = op. f i l ter ( pbi , nul l ) ;

    / / Hace que l a r ef er enci a dbi apunt e a obidbi = pbi ;

    }

    La figura 14.28 muestra la imagen original y la imagen aumentada 20% en el eje

    de X y disminuida 20% en el eje Y.

    Figura 14.28. Izquierda: Imagen or iginal, derecha: Imagen aumentada 20% en

    el eje de X y disminuida 20% en el eje Y.

    El siguiente cdigo rota una imagen 60 alrededor de su centro.

    / * ** Est e met odo r ot a una i magen en 60 grados al r ededor de su cent r o.* haci endo una operaci on de t r ansf ormaci on.* @par am f r ame Vent ana sobr e l a que se despl i ega el mensaj e de er r or

  • 7/22/2019 Tema 14 - Imgenes en Java

    42/42

    588 Imgenes en Java

    */publ i c voi d r ota( J Frame f r ame) {

    / / ver i f i ca que haya una i magen l i st a para ser procesada

    i f ( ! pr epar aI magenPr ocesar ( f r ame) )return;

    / / Obt i ene el t amao de l a i mageni nt al t oI magen = pbi . get Hei ght ( ) ;i nt anchoI magen = pbi . getWi dt h( ) ;

    / / Cr ea una t r ansf ormaci on par a rot ar una i magen en 60 grados

    / / al r ededor de su cent r oAf f i neTransf or m at = Af f i neTr ansf or m. get Rot at eI nst ance(

    Math. PI / 6, al t oI magen/ 2, anchoI magen/ 2) ; Render i ngHi nts r h = new Render i ngHi nts(

    Render i ngHi nts. KEY_I NTERPOLATI ON,Render i ngHi nts. VALUE_I NTERPOLATI ON_BI LI NEAR) ;

    Af f i neTr ansf ormOp op = new Af f i neTr ansf ormOp( at , r h) ;

    / / Fi l t r a l a i magen usando l a oper aci on

    pbi = op. f i l ter ( pbi , nul l ) ;

    / / Hace que l a r ef er enci a dbi apunt e a obidbi = pbi ;

    }

    La figura 14.29 muestra la imagen original rotada 60 alrededor de su centro.

    Figura 14.29. Izquierda: Imagen original, derecha: Imagen rotada 60