1. Parte 1: Entrada / Salida

Texto completo

(1)

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

(2)

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 asignado

a)

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.

(3)

}

/∗ ∗ 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

(4)

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

(5)

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:

(6)

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 ( ) ; } }

Modificarla para poder serializar objetos de este tipo. No se debe almacenar el password durante

la serializaci´

on.

Realizar otra clase que contenga el main(.) en la que se hagan este tipo de operaciones con un

objeto de la clase anterior:

1.

Crear un objeto del tipo Comprador.

2.

Conectar.

3.

Sumar a la cesta una determinada cantidad.

4.

Mostrar el contenido de la cesta.

5.

Serializar el objeto.

6.

Leer el objeto serializado.

7.

Conectar.

8.

Sumar a la cesta una determinada cantidad.

9.

Mostrar el contenido de la cesta (que deber´

a tener la suma de las dos cantidades).

Figure

Actualización...

Referencias

Actualización...

Related subjects :