Objetivos
Entrada/Salida. Serializaci´
on de objetos.
´
Indice
1. Parte 1: Entrada / Salida
1
2. Parte 2: Serializaci´
on de objetos
5
1.
Parte 1: Entrada / Salida
Se pide realizar una serie de clases para una aplicaci´
on de procesado (muy trivial) de im´
agenes.
En el caso que nos ocupa, trabajaremos con una imagen en escala de grises y por lo tanto la imagen
estar´
a representada mediante un array de datos con valores enteros en el rango {0, 1, · · · , 254, 255}.
El tama˜
no de la imagen es de 512 × 512 pixels.
La figura
1
muestra un aumento de una imagen en la que se ha superpuesto el valor del nivel de
gris.
Figura 1: Aumento de una parte de una imagen en la que se
pueden ver los pixels y sus niveles de gris
El procesado que se va a realizar consiste en la sustituci´
on de los valores de nivel de gris de la
valores.
0 50 100 150 200 250 0 50 100 150 200 250 Valor original Valor asignado 0 50 100 150 200 250 0 50 100 150 200 250 Valor original Valor asignadoa)
b)
Figura 2: Ejemplo de tablas de correspondencia: a) Umbral a 128 y b) Escala lineal entre 30 y 100
Se proporciona una clase TablasCorrespondencia que define 2 m´
etodos est´
aticos que devuelven
tablas de transformaci´
on:
1.
public static int[] tablaUmbral(int corte) Devuelve una tabla para realizar una
umbra-lizaci´
on en un determinado nivel (todos los valores por debajo del valor pasado como argumento
se ponen a 0, correspondiente al negro, y todos los valores por encima se ponen a 255,
corres-pondiente al blanco).
2.
public static int[] tablaEscala(int min,int max) Devuelve una tabla para realizar un
cambio de escala. Al valor 0 le hace corresponder min y valor 255 le hace corresponder max.
}
/∗ ∗ D e v u e l v e una t a b l a p a r a r e a l i z a r un e s c a l a d o
∗ de l o s d a t o s
∗ @param min v a l o r a l que c o r r e s p o n d e e l 0 ∗ @param max v a l o r a l que c o r r e s p o n d e e l 2 5 5
∗ @return l a t a b l a como un v e c t o r de e n t e r o s
∗/
p u b l i c s t a t i c i n t [ ] t a b l a E s c a l a ( i n t min , i n t max ) {
i n t [ ] b = new i n t [ 2 5 6 ] ;
f o r ( i n t i = 0 ; i < 2 5 5 ; i ++)
b [ i ] = ( ( ( max − min ) ∗ i ) / 2 5 5 + min ) ; r e t u r n b ;
} }
Otra de las clases que se proporciona es la clase MuestraImagen que representa a una ventana con
una serie de componentes donde se visualizar´
a la imagen (esta clase sirve como ejemplo de AWT y
como ejemplo de c´
omo se tratan eventos mediante clases an´
onimas).
i m p o r t j a v a . awt . Frame ; i m p o r t j a v a . i o . B u f f e r e d I n p u t S t r e a m ; i m p o r t j a v a . i o . F i l e I n p u t S t r e a m ; i m p o r t j a v a . i o . I O E x c e p t i o n ; i m p o r t j a v a . i o . I n p u t S t r e a m ; i m p o r t j a v a . awt . ∗ ; i m p o r t j a v a . awt . e v e n t . ∗ ;i m p o r t j a v a . awt . image . MemoryImageSource ; /∗ ∗ C l a s e que r e p r e s e n t a a una v e n t a n a . ∗ @author L e n g u a j e s de Programacion ∗/ p u b l i c c l a s s MuestraImagen e x t e n d s Frame { Image img ; p r i v a t e T e x t F i e l d c ; p r i v a t e Button b ; p r i v a t e L i e n z o l i ; /∗ ∗ C l a s e que e x t i e n d e a P a n e l ∗ Se s o b r e −e s c r i b e e l metodo p a i n t de P a n e l
l i = new L i e n z o ( ) ; add ( l i , B o r d e r L a y o u t .CENTER) ; /∗ Se r e g i s t r a un o b j e t o que e x t i e n d e a MouseAdapter p a r a t r a t a r l o s e v e n t o s de r a t o n en e l b o t o n . Lo que s e h a c e e s c a r g a r y m o s t r a r l a imagen que s e ha i n d i c a d o en e l campo de t e x t o e n v i a n d o un mensaje a r e p a i n t de L i e n z o que e n c o l a un e v e n t o de p i n t a d o que l l a m a r a a p a i n t de L i e n z o ( e l metodo que s e ha s o b r e −e s c r i t o ∗/ b . a d d M o u s e L i s t e n e r ( new MouseAdapter ( ) { p u b l i c v o i d m o u s e P r e s s e d ( MouseEvent e ) { t r y { I n p u t S t r e a m i s = new B u f f e r e d I n p u t S t r e a m ( new F i l e I n p u t S t r e a m ( c . g e t T e x t ( ) ) ) ; i n t d a t o ; i n t c o n t =0; i n t [ ] imagen = new i n t [ 5 1 2 ∗ 5 1 2 ] ; w h i l e ( ( d a t o= i s . r e a d ( ) ) !=−1) { i n t r = d a t o & 0 x f f ; i n t g = d a t o & 0 x f f ; i n t b = d a t o & 0 x f f ; imagen [ c o n t ] = ( 2 5 5 < < 2 4 ) | ( r < < 16) | ( g < < 8) | b ; c o n t ++; } i s . c l o s e ( ) ;
img = c r e a t e I m a g e ( new MemoryImageSource ( 5 1 2 , 5 1 2 , imagen , 0 , 5 1 2 ) ) ; l i . r e p a i n t ( ) ; } c a t c h ( I O E x c e p t i o n ex ) { System . o u t . p r i n t l n ( ” E r r o r de l e c t u r a d e l f i c h e r o ” ) ; ex . p r i n t S t a c k T r a c e ( ) ; } } } ) ; /∗ Se r e g i s t r a un o b j e t o que e x t i e n d e a WindowAdapter p a r a t r a t a r l o s e v e n t o s s o b r e l a v e n t a n a . Cuando s e p u l s e p a r a c e r r a r l a v e n t a n a s e f i n a l i z a l a a p l i c a c i o n ∗/
addWindowListener ( new WindowAdapter ( ) {
p u b l i c v o i d w i n d o w C l o s i n g ( WindowEvent e ) { System . e x i t ( 0 ) ; } } ) ; s e t S i z e ( 7 0 0 , 7 0 0 ) ; show ( ) ; } }
Finalmente se proporciona la clase ProcesaImagen que contiene el main(.).
Para esta parte de la pr´
actica se deben realizar dos clases:
1.
Una clase FilterOutputImagen que extienda a FilterOutputStream de forma que esta clase
se pueda encadenar siguiendo el patr´
on decorador. Esta clase se encarga de almacenar en un
fichero la imagen transformada seg´
un la tabla que se pase en el momento de su creaci´
on (ver
el main()). Como se puede observar en el main() las operaciones de escritura se delegar´
an en
OutputStream se podr´ıa por ejemplo pasar a un objeto del tipo ZipOutputStream creando de
una vez un fichero comprimido.
Esta clase FilterOutputImagen es similar a la clase MayusculasWriter
que se coment´
o en teor´ıa.
2.
Una clase OutputImagen Esta clase se encarga tambi´
en de almacenar en un fichero la imagen
transformada seg´
un la tabla de transformaci´
on que le se pase en el momento de su creaci´
on (ver
el main()). En este caso no se utilizar´
a ninguna clase con buffer. El esqueleto de esta clase es:
p u b l i c c l a s s OutputImagen { p r i v a t e OutputStream o s ; p r i v a t e i n t [ ] l o o k u p T a b l e ; p u b l i c OutputImagen ( OutputStream o , i n t [ ] t a b l e ) {} p u b l i c v o i d g u a r d a ( b y t e b ) t h r o w s I O E x c e p t i o n {} p u b l i c v o i d c i e r r a ( ) t h r o w s I O E x c e p t i o n {} }
En el main(.) se mide el tiempo que se tarda en realizar la escritura utilizando cada una de estas
clases.
2.
Parte 2: Serializaci´
on de objetos
En la segunda parte de la pr´
actica se propone trabajar con la serializaci´
on de objetos.
Se dispone de la siguiente clase:
p u b l i c v o i d sumaCesta ( d o u b l e c ) t h r o w s E x c e p t i o n { i f ( ! p e r m i t e C o n e x i o n ) t h r o w new E x c e p t i o n ( ) ; e l s e c e s t a = c e s t a . add ( new B i g D e c i m a l ( c ) ) ; } p u b l i c d o u b l e c o n s u l t a C e s t a ( ) t h r o w s E x c e p t i o n { i f ( ! p e r m i t e C o n e x i o n ) t h r o w new E x c e p t i o n ( ) ; e l s e r e t u r n c e s t a . d o u b l e V a l u e ( ) ; } }