SlideShare una empresa de Scribd logo
Java a Tope:


              Cómo tratar con Java
   figuras, imágenes y texto en dos dimensiones




                               Sergio Gálvez Rojas
                               Manuel Alcaide García
                               Miguel Ángel Mora Mata
JAVA A TOPE : JAVA2D (CÓMO TRATAR CON JAVA FIGURAS, IMÁGENES Y
TEXTO EN DOS DIMENSIONES). EDICIÓN ELECTRÓNICA

A U TOR ES :         S ERGIO G Á LVEZ R OJAS
                     M AN U EL A LCAID E G ARCIA
                     M IGU EL ÁN GEL M ORA M ATA
I LU STRACIÓ N
D E PO RTAD A :      H TTP ://W W W . IN TERPEQ U ES 2. CO M /


Sun, el logotipo de Sun, Sun Microsystems y Java son marcas o marcas registradas de Sun
Microsystems Inc. en los EE.UU. y otros países. El personaje de «Duke» es una marca de Sun
Microsystems Inc.




Depósito Legal: MA-0722-2007
ISBN: 978-84-690-5677-6
Java a tope:

          Java2D
  Cómo tratar con Java figuras, imágenes y texto en dos
                      dimensiones



                     Sergio Gálvez Rojas
                  Doctor Ingeniero en Informática


                   Manuel Alcaide García
           Ingeniero Técnico en Informática de Sistemas


                  Miguel Ángel Mora Mata
             Ingeniero Técnico Superior en Informática




          Dpto. de Lenguajes y Ciencias de la Computación
                  E.T.S. de Ingeniería Informática
                      Universidad de Málaga
Java 2d
Java a tope: Java2D




                                                                                                       Índice


Prólogo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v

Capítulo 1:            Introducción. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
     1.1 Descripción del capítulo.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
     1.2 Renderizado con Graphics2D.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
         1.2.1     Atributos de pincel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
         1.2.2     Atributos de relleno. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
         1.2.3     La porción a dibujar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
         1.2.4     Transformaciones.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
         1.2.5     Métodos de composición. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
     1.3 ¿Qué puede dibujarse?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
         1.3.1     Figuras geométricas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
              1.3.1.1 Conceptos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
         1.3.2     Fuentes y diseño de texto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
         1.3.3     Tratamiento de imágenes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
     1.4 Tratamiento del color.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

Capítulo 2:            Renderizado de imágenes con Graphics2D. . . . . . 15
     2.1 Introducción. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     15
         2.1.1     Ejemplo preliminar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .             15
     2.2 El contexto.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   17
     2.3 El sistema de coordenadas de Java2D.. . . . . . . . . . . . . . . . . . . . . . . . . .                   18
         2.3.1     Coordenadas de usuario. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .               18
         2.3.2     Coordenadas de dispositivo. . . . . . . . . . . . . . . . . . . . . . . . . . .                 18
     2.4 Un paso adelante: el canal alfa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .            20
     2.5 Modificación del contexto de Graphics2D. . . . . . . . . . . . . . . . . . . . . . .                      22
         2.5.1     Preferencias, pinceles y colores.. . . . . . . . . . . . . . . . . . . . . . . .                22
              2.5.1.1 Preferencias.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .           23
              2.5.1.2 Especificar el estilo de línea.. . . . . . . . . . . . . . . . . . . . . . .                 24
              2.5.1.3 Especificación de los atributos de relleno. . . . . . . . . . . . . .                        28
                   2.5.1.3.1         Gradiente de color .. . . . . . . . . . . . . . . . . . . . . . .             28
                   2.5.1.3.2         Relleno con texturas.. . . . . . . . . . . . . . . . . . . . . .              29
         2.5.2     Establecimiento del clipping path.. . . . . . . . . . . . . . . . . . . . . .                   31
         2.5.3     Transformaciones de objetos.. . . . . . . . . . . . . . . . . . . . . . . . . .                 32
         2.5.4     Composición de objetos gráficos.. . . . . . . . . . . . . . . . . . . . . . .                   34


                                                         i
Índice



Capítulo 3:            Figuras geométricas en Java2D. . . . . . . . . . . . . . . 39
     3.1 Introducción. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .    39
     3.2 Figuras básicas.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .    39
         3.2.1     Line2D.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     39
         3.2.2     Rectangle2D.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .        40
         3.2.3     RoundRectangle2D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .              41
         3.2.4     Ellipse2D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     42
         3.2.5     Arc2D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     42
         3.2.6     QuadCurve2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .          43
         3.2.7     CubicCurve2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .           45
         3.2.8     Point2D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     46
         3.2.9     Resumen de clases relacionadas con figuras geométricas. . . . .                                47
     3.3 Un primer ejemplo compuesto: bañera. . . . . . . . . . . . . . . . . . . . . . . . . .                   48
     3.4 La interfaz Shape.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .      48
         3.4.1     Otra manera de construir figuras: GeneralPath. . . . . . . . . . . . .                         50
         3.4.2     Figuras geométricas a la medida: la bañera. . . . . . . . . . . . . . .                        51
         3.4.3     Áreas Geométricas Constructivas (CAG). . . . . . . . . . . . . . . . .                         55
              3.4.3.1 Sherezade en el crepúsculo. . . . . . . . . . . . . . . . . . . . . . . .                   57
     3.5 JOGL (Java/OpenGL). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .            58

Capítulo 4:            Tratamiento de texto con Java2D. . . . . . . . . . . . . 61
     4.1 Introducción. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .    61
     4.2 ¿Cómo encontrar las fuentes?.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .             62
         4.2.1    Crear y derivar fuentes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .            63
     4.3 Dibujar texto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   63
         4.3.1    Dibujar una única línea de texto. . . . . . . . . . . . . . . . . . . . . . . .                 63
         4.3.2    Dibujar un párrafo completo.. . . . . . . . . . . . . . . . . . . . . . . . . .                 66
         4.3.3    Cómo dibujar texto sobre una imagen.. . . . . . . . . . . . . . . . . . .                       70
         4.3.4    Letra cursiva invertida mediante transformaciones. . . . . . . . . .                            73
         4.3.5    Rellenar un clipping path con distintos objetos. . . . . . . . . . . . .                        74
     4.4 Manejo de la clase TextAttribute. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .              77

Capítulo 5:            Imágenes con Java2D. . . . . . . . . . . . . . . . . . . . . . . 81
     5.1 Introducción. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .    81
     5.2 Obtención de imágenes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .           81
         5.2.1    Cargar una imagen.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .             81
         5.2.2    Cargar una imagen como BufferedImage. . . . . . . . . . . . . . . . .                           83
         5.2.3    Crear imágenes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .           85
     5.3 Mostrar una imagen.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .         87
     5.4 La clase MediaTracker.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .          88


                                                        ii
Java a tope: Java2D

   5.5 Dibujar sobre imágenes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
       5.5.1     Double Buffering (dibujo en memoria). . . . . . . . . . . . . . . . . . . 91
   5.6 Procesamiento de imágenes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
       5.6.1     Operaciones predefinidas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
            5.6.1.1 ConvolveOp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
            5.6.1.2 AffineTransformOp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
            5.6.1.3 LookupOp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
            5.6.1.4 RescaleOp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
            5.6.1.5 ColorConvertOp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
       5.6.2     Dentro de BufferedImage. . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

Capítulo 6:           El color en Java2D. . . . . . . . . . . . . . . . . . . . . . . . 117
   6.1 Introducción. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .       117
   6.2 Cómo crear un color. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .            117
       6.2.1     Un ejemplo con colores. . . . . . . . . . . . . . . . . . . . . . . . . . . . .                 119
   6.3 Espacios de Colores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .          121
       6.3.1     El espacio de colores CIEXYZ. . . . . . . . . . . . . . . . . . . . . . . .                     121
       6.3.2     El espacio de colores sRGB . . . . . . . . . . . . . . . . . . . . . . . . . .                  122
   6.4 La clase ColorSpace.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .           122
   6.5 Perfiles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   124
   6.6 La verdad sobre el color. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .           125




                                                       iii
Índice




         iv
Java a tope: Java2D




                                                                          Prólogo



         E
                l objetivo básico del texto que el lector tiene entre sus manos es
                realizar un estudio completo y didáctico sobre la tecnología Java2D
                que sirva como documentación para actuales y futuros programadores
en esta tecnología. Se pretende ser lo más claro y conciso posible pero sin dejar de
estudiar, aunque en algunos casos sea sólo someramente, todos y cada uno de los
conceptos que abarca Java2D.
         Como objetivo complementario este texto pretende ser, ante todo, práctico.
Para ello se incluye una gran cantidad de ejemplos que muestran cada concepto
explicado, teniendo en mente siempre su capacidad de ilustración y vistosidad de
forma que la lectura resulte amena y distraída, pero sobre todo útil.
        Merced a una elaborada estructuración del texto en apartados y subapartados,
cada uno centrado en un concepto distinto, nuestros objetivos se completan con el
deseo de satisfacer tanto a los lectores que quieran aprender a usar la tecnología
Java2D en general como a aquéllos que sólo necesiten aclarar una duda puntual y sólo
deseen consultar un apartado concreto.
         Las posibilidades de Java2D son casi ilimitadas. Partiendo del control básico
de figuras geoméricas simples y trozos de texto gestionado como imágenes el lector
irá profundizando en las distintas opciones de configuración hasta poseer un control
completo sobre los efectos visuales producidos. En concreto, la manipulación que
puede ejercerse con Java2D sobre las imágenes en general es muy potente existe una
gran cantidad de detalles que pueden controlarse con poco esfuerzo. Además de los
efectos visuales producidos por la modificación de colores y pinceles, transparencias,
tramas de relleno y demás, también resulta interesante el poder aplicar
transformaciónes geométricas a las imágenes, con lo que éstas incluso pueden llegar
a adoptar un curioso aspecto de tridimensionalidad.




                                          v
Prólogo




          vi
Java a tope: Java2D



                                                                             Capítulo 1
                                                                        Introducción


          1.1       Descripción del capítulo
         La API Java2D amplía muchas de las capacidades gráficas de la biblioteca
AWT (Abstract Window Toolkit - Herramientas Abstractas de Ventanas), permitiendo
la creación de mejores interfaces de usuario y de aplicaciones Java mucho más
impactantes visualmente. El rango que abarcan todas estas mejoras es muy amplio,
ya que comprende el renderizado1, la definición de figuras geométricas, el uso de
fuentes de letras, la manipulación de imágenes y el enriquecimiento en la definición
del color. También permite la creación de bibliotecas personalizadas de gráficos
avanzados o de efectos especiales de imagen e incluso puede ser usada para el
desarrollo de animaciones u otras presentaciones multimedia al combinarla con otras
APIs de Java, como puedan ser JMF (Java Media Framework - Entorno de Trabajo
de Java para Medios Audiovisuales) o Java 3D.
         En esta introducción estableceremos un marco general en el que quede bien
definido y delimitado lo que esta API puede ofrecer en cuanto a posibilidades y
prestaciones. Para ello describiremos todos sus aspectos y características, así como sus
aplicaciones, empezando por el renderizado 2D.


          1.2       Renderizado con Graphics2D
         java.awt.Graphics2D es una clase que extiende a java.awt.Graphics
proporcionándole un control más potente sobre la presentación de texto, imágenes o
figuras geométricas. Un objeto Graphics (que es una clase abstracta) representa el
lienzo abstracto y el contexto en el que puede dibujarse cualquier cosa; este lienzo
puede estar enlazado con un área física de un monitor, o representar una imagen en
memoria que sólo se desea manipular y no tiene representación directa durante este
proceso.
          El proceso de renderizado de Java2D está controlado por un objeto de esta


          1
            Debido a la lentitud con que la Real Academia de la Lengua Española reacciona
ante la necesidad de incorporar nuevos vocablos o ampliar acepciones en los ya existentes, los
autores nos hemos visto obligados a admitir el verbo renderizar con el siguiente significado:
«Generar una imagen a partir de un modelo»

                                              1
Introducción

clase Graphics2D y sus atributos o características contextuales que son, a su vez,
objetos (un atributo contextual puede ser, por ejemplo, el tamaño del pincel con que
se dibuja una línea recta); el conjunto de estos atributos es lo que conforma el contexto
del objeto Graphics2D. Así por ejemplo, para dibujar una imagen sobre un
Graphics2D es necesario modificar su contexto adecuadamente y llamar después a
alguno de los métodos de renderizado.
         Como caso general, el proceso de renderizado de un objeto java.awt.Shape
se puede dividir en cuatro pasos. Para simplificar en estos preliminares, basta decir
que Shape es una interfaz que sustenta la definición de clases con formas geométricas
diversas. Los cuatro pasos comentados son:
         1. En el momento de pintar al objeto Shape, se utiliza un objeto de la clase
            Stroke (que establece el pincel en el contexto del Graphics2D) para
            generar un nuevo Shape que representa el contorno del objeto a pintar.
            Stroke hace las veces de pincel o lápiz de contorno.
         2. Las coordenadas en que dibujar al nuevo objeto Shape se transforman
            desde el user space al device space de acuerdo con el atributo de
            transformación del contexto del Graphics2D. El user space
            (coordenadas de usuario) es un sistema de coordenadas absoluto e
            independiente del sistema físico donde plasmar el dibujo, mientras que
            el device space (coordenadas de dispositivo) es un sistema de
            coordenadas que sí depende del sistema final sobre el que dibujar; por
            ejemplo, si se usa un sistema multipantalla se obtendrá un renderizado
            distinto al monopantalla. En los casos más usuales, ambos sistemas de
            coordenadas coinciden.
         3. El contorno de la figura de tipo Shape se obtiene como una secuencia de
            segmentos que se dibujan en secuencia.
         4. El contorno resultante se rellena usando los atributos de tipo Paint y
            Composite del contexto del Graphics2D.
        Entre las clases e interfaces más importantes, incluyendo las utilizadas por
el contexto, podemos citar las siguientes (contenidas en los paquetes java.awt y
java.awt.geom):
     • Interfaces:
            1. Composite: define métodos para realizar composiciones de
                 dibujos, esto es, definir el comportamiento del sistema a la hora de
                 dibujar por ejemplo una figura geométrica sobre un área de gráficos
                 que ya contenga algo dibujado. Entre otras cosas permite definir
                 transparencias.
            2. Paint: extiende a Transparency y define la forma en que se
                 construyen las tramas de color durante las operaciones draw() y
                 fill().
            3. Stroke: permite a un Graphics2D generar un objeto Shape que


                                           2
Java a tope: Java2D

                 representa el contorno de la figura que se quiere dibujar.
     •   Clases:
             1. AffineTransform: representa una transformación en 2
                 dimensiones: traslación, inversión, rotación, etc.
             2. AlphaComposite: implementa a Composite. Gestiona la
                 composición alfa (transparencias) básica para las figuras, textos e
                 imágenes.
             3. BasicStroke: implementa a Stroke. Define el estilo del pincel que
                 se aplica al dibujar el contorno de una figura.
             4. Color: implementa a Paint. Define por ejemplo el color del relleno
                 o del contorno al dibujar una figura.
             5. GradientPaint: implementa a Paint. Define un patrón de relleno
                 en forma de gradiente lineal de color. En otras palabras, al rellenar
                 una figura, no se utiliza un solo color, sino un degradado de color
                 que parte de un color inicial hasta otro final pasando por toda la
                 gama intermedia.
             6. Graphics2D: extiende a Graphics. Es la clase fundamental para
                 el renderizado 2D.
             7. TexturePaint: define un patrón de relleno complejo al rellenar una
                 figura. Este patrón -también llamado textura- está almacenado en
                 un objeto de tipo BufferedImage.
         Como ya se ha comentado anteriormente, para dibujar un objeto gráfico,
antes debe establecerse el contexto en que se realizará el renderizado y después debe
llamarse a uno de los métodos de renderizado de Graphics2D. Pues bien, los atributos
de estado que conforman el contexto y que pueden modificarse son los siguientes:
         1. Variar la anchura del pincel.
         2. Definir colores o patrones de relleno para las figuras.
         3. Delimitar un área concreta a renderizar (clipping path).
         4. Trasladar, rotar, reducir o ampliar objetos cuando son renderizados.
         5. Especificar la forma en que se componen las figuras superpuestas.


         1.2.1 Atributos de pincel
         Los atributos del pincel (que pertenecen a la interfaz Stroke) definen las
características del trazo dibujado por el lápiz o pincel en la imagen. Con BasicStroke
pueden definirse características tales como el ancho de línea, la forma en que acaba
un trazo o el estilo con que se unen varios segmentos en un dibujo.
        Los métodos de renderizado de Graphics2D que usa como atributo
contextual un objeto de tipo Stroke son draw(), drawArc(), drawLine(), drawOval(),
drawPolygon(), drawPolyline(), drawRect() y drawRoundRect(). Cuando se
invoca a uno de estos métodos se renderiza el contorno correspondiente (según la

                                          3
Introducción

función llamada) y, acto seguido, el atributo Stroke define las características del trazo
mientras que el atributo Paint define el color o el patrón de relleno de la marca
dibujada por el pincel.


          1.2.2 Atributos de relleno
          Los atributos de relleno del contexto de un Graphics2D están representados
por un objeto Paint. Cuando una figura o un glyph (un glyph es, tipográficamente
hablando, el rasgo de un signo o una letra según una fuente de texto; en otras
palabras, la forma de una letra concreta a partir de su tipo, tamaño y peculiaridades:
negrita, cursiva, fileteada, etc. La impresión de una secuencia de rasgos tipográficos
produce una cadena de texto, y cada uno de estos rasgos, como se verá más adelante,
son tratados como un objeto Shape más) el objeto Paint se aplica a todos los píxeles
que quedan dentro de la figura en sí, y que representa el contorno del objeto dibujado
por el pincel. Al rellenar el interior de una figura, el objeto Paint se encarga de
gestionar todos los píxeles de la figura, a excepción de los del contorno.
         Rellenar una figura con un único color opaco se puede hacer fácilmente
estableciendo dicho color en el contexto del objeto Graphics2D con el método
setColor(). La clase Color es la implementación mas básica de la interfaz Paint. Para
hacer rellenos más complejos, pueden usarse las clases GradientPaint y
TexturePaint, que también heredan de Paint en Java2D.


          1.2.3 La porción a dibujar
         La porción a dibujar (en inglés clipping path) es el trozo de una figura o
imagen que debe ser renderizada; este trozo puede tener cualquier forma, y no tiene
porqué ser necesariamente un rectángulo sino que su forma puede ser establecida por
programa. Cuando se define una porción a dibujar (clipping path) en el propio
contexto de un Graphics2D, sólo las zonas delimitadas por dicha porción (las que
caen en su interior) son las que serán renderizadas. Para cambiar esta porción del
dibujo, puede usarse setClip() con objeto de crear un área nueva o también es posible
invocar al método clip(Shape) para modificar uno ya existente mediante la
intersección con otro que se pasa como parámetro.


          1.2.4 Transformaciones
         El contexto de un objeto Graphics2D contiene una transformación que se
usa al reubicar objetos desde el espacio de usuario (user space) al espacio del
dispositivo (device space) durante el renderizado. Graphics2D proporciona varios


                                           4
Java a tope: Java2D

métodos que permiten modificar la transformación por defecto en su contexto. Lo más
sencillo es llamar a uno de los métodos de transformación de Graphics2D como
rotate(), scale(), shear() o translate(): sólo es necesario especificar para cada una
de ellos las características de la transformación requerida y Graphics2D
automáticamente hará los cambios pertinentes en el momento de hacer el dibujo.
         Es más, también es posible concatenar transformaciones mediante el uso de
un objeto de la clase AffineTransform, el cual puede realizar transformaciones en
secuencia, tales como una rotación seguida de un cambio de escala. Cuando una
transformación se concatena con otra existente, la última que se especificó es la
primera en ser aplicada. Graphics2D contiene también un método setTransform(),
que sobrescribe las transformaciones a aplicar a los objetos que se vayan a dibujar
pero que, ojo, no es posible usar para realizar concatenación de transformaciones.


         1.2.5 Métodos de composición
          Cuando dos objetos se superponen en un mismo dibujo (ya sean figuras,
rasgos tipográficos o imágenes) es necesario determinar qué colores renderizar en los
píxeles superpuestos: este proceso se denomina composición. Las interfaces básicas
de composición de Java2D son Composite and CompositeContext. Por ejemplo,
para especificar el estilo de composición que debe usarse puede establecerse un objeto
de la clase AlphaComposite en el contexto de un Graphics2D llamando a su método
setComposite(). Las instancias de la clase AlphaComposite establecen una regla
de composición que describe la manera de mezclar un nuevo color con otro ya
existente definiendo, por ejemplo, transparencias.
         Con este objetivo, para manejar transparencias, se dispone de un valor alfa
adicional al crear un objeto AlphaComposite. Este valor alfa (asociado al llamado
«canal alfa» de una imagen), incrementa o decrementa el canal de transparencia del
objeto según el valor que tome: si el valor de alfa es 1,0 el color será opaco, mientras
que el color será totalmente transparente si vale 0,0. Por suspuesto, los valores
intermedios especifican transparencias intermedias del color. Así pues, el canal alfa
se usa en conjunto con un objeto de la clase Composite en el contexto de un
Graphics2D para mezclar la imagen con los dibujos ya existentes. Un ejemplo de
manejo de transparencias aparece en la figura 1.1.




                              Figura 1.1. Ejemplo de transparencia


                                           5

Más contenido relacionado

PDF
PDF
Metodologia orientada a objeto - libro
PDF
Documentacion age
PDF
Pensar en cpp
PDF
Thinking in c++ (em espanhol)
PDF
Manual de qcad
PDF
Manual Qcad
Metodologia orientada a objeto - libro
Documentacion age
Pensar en cpp
Thinking in c++ (em espanhol)
Manual de qcad
Manual Qcad

La actualidad más candente (14)

PDF
Algoritmos
PDF
Java A Tope J2 Me (Java 2 Micro Edition)
PDF
PDF
Manual de lenguaje C++
PDF
Folleto desarrollado para SolidWorks 2006: Chapa metalica y piezas soldadas
PDF
Gretl guide-es[1]
PDF
03 01-conceptos basicos-de_solid_works-piezas_y_ensamblajes
PDF
Diseño canónico control automatico
PDF
Curso grass
PDF
Econometria aplicada con gretl
PDF
Metodologia Hefesto - Business Intelligence
PDF
PDF
Datawarehouse hefesto
PDF
24965846 sap-2000-v14-manual-espanol
Algoritmos
Java A Tope J2 Me (Java 2 Micro Edition)
Manual de lenguaje C++
Folleto desarrollado para SolidWorks 2006: Chapa metalica y piezas soldadas
Gretl guide-es[1]
03 01-conceptos basicos-de_solid_works-piezas_y_ensamblajes
Diseño canónico control automatico
Curso grass
Econometria aplicada con gretl
Metodologia Hefesto - Business Intelligence
Datawarehouse hefesto
24965846 sap-2000-v14-manual-espanol
Publicidad

Destacado (20)

ODP
Explorando o uso da sala de informática (1)
PPTX
Slae zambrano
PPT
Numeros complejos 1_y_2
PPTX
Aplicación y mantenimiento de sistemas operativos
PPS
10 palabras
PPT
Presentación del curso
PDF
Citroen C4 Picasso: Scheda Tecnica
DOCX
Robert Askey CV
PDF
Pluralidade
PPTX
Porque los jóvenes universitarios no asisten a museos
DOCX
Emakumeen aurkako indarkeria
DOCX
Melissa Hamm Resume 2016 Research Only
PDF
Java basico 2
PDF
Ummat wahida banne ka wahid hal
PPT
Mjsouza ativ3
PDF
Definicao planejamento urbano
PDF
Modulo 1 introducao ao estudo da sociedade
PDF
Postcard
PDF
Listino Prezzi Citroen Spacetourer 2016 Settembre
Explorando o uso da sala de informática (1)
Slae zambrano
Numeros complejos 1_y_2
Aplicación y mantenimiento de sistemas operativos
10 palabras
Presentación del curso
Citroen C4 Picasso: Scheda Tecnica
Robert Askey CV
Pluralidade
Porque los jóvenes universitarios no asisten a museos
Emakumeen aurkako indarkeria
Melissa Hamm Resume 2016 Research Only
Java basico 2
Ummat wahida banne ka wahid hal
Mjsouza ativ3
Definicao planejamento urbano
Modulo 1 introducao ao estudo da sociedade
Postcard
Listino Prezzi Citroen Spacetourer 2016 Settembre
Publicidad

Similar a Java 2d (20)

PDF
Java2 d
PDF
Java 2 d
PPTX
Java 2 d
PPTX
Renderización en java
PDF
Api java 2D
PDF
Coreldraw graphics suite x3
PDF
PDF
Manual coreldraw
PDF
Manual espanol corel_draw_x3
PDF
M2 programacion grafica_2ed
PDF
Realidad aumentada 1a_edicion
PDF
Realidad aumentada 1a_edicion
PDF
Manual macromedia free hand mx
PDF
Micro Station V8
PPT
Primitivas
PDF
Corel draw x3_-_manual_en_español
PPTX
Introduccion a graficos mediante JAVA 2D
PPTX
UNIDAD I.pptx
DOCX
PDF
Tema 13 gráficas en java por gio
Java2 d
Java 2 d
Java 2 d
Renderización en java
Api java 2D
Coreldraw graphics suite x3
Manual coreldraw
Manual espanol corel_draw_x3
M2 programacion grafica_2ed
Realidad aumentada 1a_edicion
Realidad aumentada 1a_edicion
Manual macromedia free hand mx
Micro Station V8
Primitivas
Corel draw x3_-_manual_en_español
Introduccion a graficos mediante JAVA 2D
UNIDAD I.pptx
Tema 13 gráficas en java por gio

Más de jtk1 (20)

PPT
Actividad modulo1
PDF
Java schaum pre
PDF
Programar java 2pre
PDF
Serlets java pre
PDF
Portada java 2
PDF
Piensa en java per
PDF
Lenguaje de programacion java prev
PDF
Java kaime conpre
PDF
Java jedi prev
PDF
Java j2me prev
PDF
Java ferca
PDF
Java desde 0 pre
PDF
Java basico 2
PDF
Java angel estevan pre
PDF
Java 3dpre
PDF
Introduc java pre
PDF
Guia de iniciación en java prev
PDF
Aprende java como si estuviera en primero pre
PDF
52 ejercicios resueltos en pseudocodigoprev
PDF
Serlets y jsp prev
Actividad modulo1
Java schaum pre
Programar java 2pre
Serlets java pre
Portada java 2
Piensa en java per
Lenguaje de programacion java prev
Java kaime conpre
Java jedi prev
Java j2me prev
Java ferca
Java desde 0 pre
Java basico 2
Java angel estevan pre
Java 3dpre
Introduc java pre
Guia de iniciación en java prev
Aprende java como si estuviera en primero pre
52 ejercicios resueltos en pseudocodigoprev
Serlets y jsp prev

Java 2d

  • 1. Java a Tope: Cómo tratar con Java figuras, imágenes y texto en dos dimensiones Sergio Gálvez Rojas Manuel Alcaide García Miguel Ángel Mora Mata
  • 2. JAVA A TOPE : JAVA2D (CÓMO TRATAR CON JAVA FIGURAS, IMÁGENES Y TEXTO EN DOS DIMENSIONES). EDICIÓN ELECTRÓNICA A U TOR ES : S ERGIO G Á LVEZ R OJAS M AN U EL A LCAID E G ARCIA M IGU EL ÁN GEL M ORA M ATA I LU STRACIÓ N D E PO RTAD A : H TTP ://W W W . IN TERPEQ U ES 2. CO M / Sun, el logotipo de Sun, Sun Microsystems y Java son marcas o marcas registradas de Sun Microsystems Inc. en los EE.UU. y otros países. El personaje de «Duke» es una marca de Sun Microsystems Inc. Depósito Legal: MA-0722-2007 ISBN: 978-84-690-5677-6
  • 3. Java a tope: Java2D Cómo tratar con Java figuras, imágenes y texto en dos dimensiones Sergio Gálvez Rojas Doctor Ingeniero en Informática Manuel Alcaide García Ingeniero Técnico en Informática de Sistemas Miguel Ángel Mora Mata Ingeniero Técnico Superior en Informática Dpto. de Lenguajes y Ciencias de la Computación E.T.S. de Ingeniería Informática Universidad de Málaga
  • 5. Java a tope: Java2D Índice Prólogo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v Capítulo 1: Introducción. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1 Descripción del capítulo.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 Renderizado con Graphics2D.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2.1 Atributos de pincel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2.2 Atributos de relleno. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2.3 La porción a dibujar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2.4 Transformaciones.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2.5 Métodos de composición. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.3 ¿Qué puede dibujarse?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.3.1 Figuras geométricas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.3.1.1 Conceptos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.3.2 Fuentes y diseño de texto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.3.3 Tratamiento de imágenes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 1.4 Tratamiento del color.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Capítulo 2: Renderizado de imágenes con Graphics2D. . . . . . 15 2.1 Introducción. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.1.1 Ejemplo preliminar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.2 El contexto.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.3 El sistema de coordenadas de Java2D.. . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.3.1 Coordenadas de usuario. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.3.2 Coordenadas de dispositivo. . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.4 Un paso adelante: el canal alfa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.5 Modificación del contexto de Graphics2D. . . . . . . . . . . . . . . . . . . . . . . 22 2.5.1 Preferencias, pinceles y colores.. . . . . . . . . . . . . . . . . . . . . . . . 22 2.5.1.1 Preferencias.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.5.1.2 Especificar el estilo de línea.. . . . . . . . . . . . . . . . . . . . . . . 24 2.5.1.3 Especificación de los atributos de relleno. . . . . . . . . . . . . . 28 2.5.1.3.1 Gradiente de color .. . . . . . . . . . . . . . . . . . . . . . . 28 2.5.1.3.2 Relleno con texturas.. . . . . . . . . . . . . . . . . . . . . . 29 2.5.2 Establecimiento del clipping path.. . . . . . . . . . . . . . . . . . . . . . 31 2.5.3 Transformaciones de objetos.. . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.5.4 Composición de objetos gráficos.. . . . . . . . . . . . . . . . . . . . . . . 34 i
  • 6. Índice Capítulo 3: Figuras geométricas en Java2D. . . . . . . . . . . . . . . 39 3.1 Introducción. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.2 Figuras básicas.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.2.1 Line2D.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.2.2 Rectangle2D.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 3.2.3 RoundRectangle2D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 3.2.4 Ellipse2D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 3.2.5 Arc2D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 3.2.6 QuadCurve2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 3.2.7 CubicCurve2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 3.2.8 Point2D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 3.2.9 Resumen de clases relacionadas con figuras geométricas. . . . . 47 3.3 Un primer ejemplo compuesto: bañera. . . . . . . . . . . . . . . . . . . . . . . . . . 48 3.4 La interfaz Shape.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 3.4.1 Otra manera de construir figuras: GeneralPath. . . . . . . . . . . . . 50 3.4.2 Figuras geométricas a la medida: la bañera. . . . . . . . . . . . . . . 51 3.4.3 Áreas Geométricas Constructivas (CAG). . . . . . . . . . . . . . . . . 55 3.4.3.1 Sherezade en el crepúsculo. . . . . . . . . . . . . . . . . . . . . . . . 57 3.5 JOGL (Java/OpenGL). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Capítulo 4: Tratamiento de texto con Java2D. . . . . . . . . . . . . 61 4.1 Introducción. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 4.2 ¿Cómo encontrar las fuentes?.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 4.2.1 Crear y derivar fuentes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 4.3 Dibujar texto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 4.3.1 Dibujar una única línea de texto. . . . . . . . . . . . . . . . . . . . . . . . 63 4.3.2 Dibujar un párrafo completo.. . . . . . . . . . . . . . . . . . . . . . . . . . 66 4.3.3 Cómo dibujar texto sobre una imagen.. . . . . . . . . . . . . . . . . . . 70 4.3.4 Letra cursiva invertida mediante transformaciones. . . . . . . . . . 73 4.3.5 Rellenar un clipping path con distintos objetos. . . . . . . . . . . . . 74 4.4 Manejo de la clase TextAttribute. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Capítulo 5: Imágenes con Java2D. . . . . . . . . . . . . . . . . . . . . . . 81 5.1 Introducción. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 5.2 Obtención de imágenes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 5.2.1 Cargar una imagen.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 5.2.2 Cargar una imagen como BufferedImage. . . . . . . . . . . . . . . . . 83 5.2.3 Crear imágenes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 5.3 Mostrar una imagen.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 5.4 La clase MediaTracker.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 ii
  • 7. Java a tope: Java2D 5.5 Dibujar sobre imágenes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 5.5.1 Double Buffering (dibujo en memoria). . . . . . . . . . . . . . . . . . . 91 5.6 Procesamiento de imágenes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 5.6.1 Operaciones predefinidas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 5.6.1.1 ConvolveOp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 5.6.1.2 AffineTransformOp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 5.6.1.3 LookupOp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 5.6.1.4 RescaleOp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 5.6.1.5 ColorConvertOp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 5.6.2 Dentro de BufferedImage. . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 Capítulo 6: El color en Java2D. . . . . . . . . . . . . . . . . . . . . . . . 117 6.1 Introducción. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 6.2 Cómo crear un color. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 6.2.1 Un ejemplo con colores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 6.3 Espacios de Colores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 6.3.1 El espacio de colores CIEXYZ. . . . . . . . . . . . . . . . . . . . . . . . 121 6.3.2 El espacio de colores sRGB . . . . . . . . . . . . . . . . . . . . . . . . . . 122 6.4 La clase ColorSpace.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 6.5 Perfiles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 6.6 La verdad sobre el color. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 iii
  • 8. Índice iv
  • 9. Java a tope: Java2D Prólogo E l objetivo básico del texto que el lector tiene entre sus manos es realizar un estudio completo y didáctico sobre la tecnología Java2D que sirva como documentación para actuales y futuros programadores en esta tecnología. Se pretende ser lo más claro y conciso posible pero sin dejar de estudiar, aunque en algunos casos sea sólo someramente, todos y cada uno de los conceptos que abarca Java2D. Como objetivo complementario este texto pretende ser, ante todo, práctico. Para ello se incluye una gran cantidad de ejemplos que muestran cada concepto explicado, teniendo en mente siempre su capacidad de ilustración y vistosidad de forma que la lectura resulte amena y distraída, pero sobre todo útil. Merced a una elaborada estructuración del texto en apartados y subapartados, cada uno centrado en un concepto distinto, nuestros objetivos se completan con el deseo de satisfacer tanto a los lectores que quieran aprender a usar la tecnología Java2D en general como a aquéllos que sólo necesiten aclarar una duda puntual y sólo deseen consultar un apartado concreto. Las posibilidades de Java2D son casi ilimitadas. Partiendo del control básico de figuras geoméricas simples y trozos de texto gestionado como imágenes el lector irá profundizando en las distintas opciones de configuración hasta poseer un control completo sobre los efectos visuales producidos. En concreto, la manipulación que puede ejercerse con Java2D sobre las imágenes en general es muy potente existe una gran cantidad de detalles que pueden controlarse con poco esfuerzo. Además de los efectos visuales producidos por la modificación de colores y pinceles, transparencias, tramas de relleno y demás, también resulta interesante el poder aplicar transformaciónes geométricas a las imágenes, con lo que éstas incluso pueden llegar a adoptar un curioso aspecto de tridimensionalidad. v
  • 10. Prólogo vi
  • 11. Java a tope: Java2D Capítulo 1 Introducción 1.1 Descripción del capítulo La API Java2D amplía muchas de las capacidades gráficas de la biblioteca AWT (Abstract Window Toolkit - Herramientas Abstractas de Ventanas), permitiendo la creación de mejores interfaces de usuario y de aplicaciones Java mucho más impactantes visualmente. El rango que abarcan todas estas mejoras es muy amplio, ya que comprende el renderizado1, la definición de figuras geométricas, el uso de fuentes de letras, la manipulación de imágenes y el enriquecimiento en la definición del color. También permite la creación de bibliotecas personalizadas de gráficos avanzados o de efectos especiales de imagen e incluso puede ser usada para el desarrollo de animaciones u otras presentaciones multimedia al combinarla con otras APIs de Java, como puedan ser JMF (Java Media Framework - Entorno de Trabajo de Java para Medios Audiovisuales) o Java 3D. En esta introducción estableceremos un marco general en el que quede bien definido y delimitado lo que esta API puede ofrecer en cuanto a posibilidades y prestaciones. Para ello describiremos todos sus aspectos y características, así como sus aplicaciones, empezando por el renderizado 2D. 1.2 Renderizado con Graphics2D java.awt.Graphics2D es una clase que extiende a java.awt.Graphics proporcionándole un control más potente sobre la presentación de texto, imágenes o figuras geométricas. Un objeto Graphics (que es una clase abstracta) representa el lienzo abstracto y el contexto en el que puede dibujarse cualquier cosa; este lienzo puede estar enlazado con un área física de un monitor, o representar una imagen en memoria que sólo se desea manipular y no tiene representación directa durante este proceso. El proceso de renderizado de Java2D está controlado por un objeto de esta 1 Debido a la lentitud con que la Real Academia de la Lengua Española reacciona ante la necesidad de incorporar nuevos vocablos o ampliar acepciones en los ya existentes, los autores nos hemos visto obligados a admitir el verbo renderizar con el siguiente significado: «Generar una imagen a partir de un modelo» 1
  • 12. Introducción clase Graphics2D y sus atributos o características contextuales que son, a su vez, objetos (un atributo contextual puede ser, por ejemplo, el tamaño del pincel con que se dibuja una línea recta); el conjunto de estos atributos es lo que conforma el contexto del objeto Graphics2D. Así por ejemplo, para dibujar una imagen sobre un Graphics2D es necesario modificar su contexto adecuadamente y llamar después a alguno de los métodos de renderizado. Como caso general, el proceso de renderizado de un objeto java.awt.Shape se puede dividir en cuatro pasos. Para simplificar en estos preliminares, basta decir que Shape es una interfaz que sustenta la definición de clases con formas geométricas diversas. Los cuatro pasos comentados son: 1. En el momento de pintar al objeto Shape, se utiliza un objeto de la clase Stroke (que establece el pincel en el contexto del Graphics2D) para generar un nuevo Shape que representa el contorno del objeto a pintar. Stroke hace las veces de pincel o lápiz de contorno. 2. Las coordenadas en que dibujar al nuevo objeto Shape se transforman desde el user space al device space de acuerdo con el atributo de transformación del contexto del Graphics2D. El user space (coordenadas de usuario) es un sistema de coordenadas absoluto e independiente del sistema físico donde plasmar el dibujo, mientras que el device space (coordenadas de dispositivo) es un sistema de coordenadas que sí depende del sistema final sobre el que dibujar; por ejemplo, si se usa un sistema multipantalla se obtendrá un renderizado distinto al monopantalla. En los casos más usuales, ambos sistemas de coordenadas coinciden. 3. El contorno de la figura de tipo Shape se obtiene como una secuencia de segmentos que se dibujan en secuencia. 4. El contorno resultante se rellena usando los atributos de tipo Paint y Composite del contexto del Graphics2D. Entre las clases e interfaces más importantes, incluyendo las utilizadas por el contexto, podemos citar las siguientes (contenidas en los paquetes java.awt y java.awt.geom): • Interfaces: 1. Composite: define métodos para realizar composiciones de dibujos, esto es, definir el comportamiento del sistema a la hora de dibujar por ejemplo una figura geométrica sobre un área de gráficos que ya contenga algo dibujado. Entre otras cosas permite definir transparencias. 2. Paint: extiende a Transparency y define la forma en que se construyen las tramas de color durante las operaciones draw() y fill(). 3. Stroke: permite a un Graphics2D generar un objeto Shape que 2
  • 13. Java a tope: Java2D representa el contorno de la figura que se quiere dibujar. • Clases: 1. AffineTransform: representa una transformación en 2 dimensiones: traslación, inversión, rotación, etc. 2. AlphaComposite: implementa a Composite. Gestiona la composición alfa (transparencias) básica para las figuras, textos e imágenes. 3. BasicStroke: implementa a Stroke. Define el estilo del pincel que se aplica al dibujar el contorno de una figura. 4. Color: implementa a Paint. Define por ejemplo el color del relleno o del contorno al dibujar una figura. 5. GradientPaint: implementa a Paint. Define un patrón de relleno en forma de gradiente lineal de color. En otras palabras, al rellenar una figura, no se utiliza un solo color, sino un degradado de color que parte de un color inicial hasta otro final pasando por toda la gama intermedia. 6. Graphics2D: extiende a Graphics. Es la clase fundamental para el renderizado 2D. 7. TexturePaint: define un patrón de relleno complejo al rellenar una figura. Este patrón -también llamado textura- está almacenado en un objeto de tipo BufferedImage. Como ya se ha comentado anteriormente, para dibujar un objeto gráfico, antes debe establecerse el contexto en que se realizará el renderizado y después debe llamarse a uno de los métodos de renderizado de Graphics2D. Pues bien, los atributos de estado que conforman el contexto y que pueden modificarse son los siguientes: 1. Variar la anchura del pincel. 2. Definir colores o patrones de relleno para las figuras. 3. Delimitar un área concreta a renderizar (clipping path). 4. Trasladar, rotar, reducir o ampliar objetos cuando son renderizados. 5. Especificar la forma en que se componen las figuras superpuestas. 1.2.1 Atributos de pincel Los atributos del pincel (que pertenecen a la interfaz Stroke) definen las características del trazo dibujado por el lápiz o pincel en la imagen. Con BasicStroke pueden definirse características tales como el ancho de línea, la forma en que acaba un trazo o el estilo con que se unen varios segmentos en un dibujo. Los métodos de renderizado de Graphics2D que usa como atributo contextual un objeto de tipo Stroke son draw(), drawArc(), drawLine(), drawOval(), drawPolygon(), drawPolyline(), drawRect() y drawRoundRect(). Cuando se invoca a uno de estos métodos se renderiza el contorno correspondiente (según la 3
  • 14. Introducción función llamada) y, acto seguido, el atributo Stroke define las características del trazo mientras que el atributo Paint define el color o el patrón de relleno de la marca dibujada por el pincel. 1.2.2 Atributos de relleno Los atributos de relleno del contexto de un Graphics2D están representados por un objeto Paint. Cuando una figura o un glyph (un glyph es, tipográficamente hablando, el rasgo de un signo o una letra según una fuente de texto; en otras palabras, la forma de una letra concreta a partir de su tipo, tamaño y peculiaridades: negrita, cursiva, fileteada, etc. La impresión de una secuencia de rasgos tipográficos produce una cadena de texto, y cada uno de estos rasgos, como se verá más adelante, son tratados como un objeto Shape más) el objeto Paint se aplica a todos los píxeles que quedan dentro de la figura en sí, y que representa el contorno del objeto dibujado por el pincel. Al rellenar el interior de una figura, el objeto Paint se encarga de gestionar todos los píxeles de la figura, a excepción de los del contorno. Rellenar una figura con un único color opaco se puede hacer fácilmente estableciendo dicho color en el contexto del objeto Graphics2D con el método setColor(). La clase Color es la implementación mas básica de la interfaz Paint. Para hacer rellenos más complejos, pueden usarse las clases GradientPaint y TexturePaint, que también heredan de Paint en Java2D. 1.2.3 La porción a dibujar La porción a dibujar (en inglés clipping path) es el trozo de una figura o imagen que debe ser renderizada; este trozo puede tener cualquier forma, y no tiene porqué ser necesariamente un rectángulo sino que su forma puede ser establecida por programa. Cuando se define una porción a dibujar (clipping path) en el propio contexto de un Graphics2D, sólo las zonas delimitadas por dicha porción (las que caen en su interior) son las que serán renderizadas. Para cambiar esta porción del dibujo, puede usarse setClip() con objeto de crear un área nueva o también es posible invocar al método clip(Shape) para modificar uno ya existente mediante la intersección con otro que se pasa como parámetro. 1.2.4 Transformaciones El contexto de un objeto Graphics2D contiene una transformación que se usa al reubicar objetos desde el espacio de usuario (user space) al espacio del dispositivo (device space) durante el renderizado. Graphics2D proporciona varios 4
  • 15. Java a tope: Java2D métodos que permiten modificar la transformación por defecto en su contexto. Lo más sencillo es llamar a uno de los métodos de transformación de Graphics2D como rotate(), scale(), shear() o translate(): sólo es necesario especificar para cada una de ellos las características de la transformación requerida y Graphics2D automáticamente hará los cambios pertinentes en el momento de hacer el dibujo. Es más, también es posible concatenar transformaciones mediante el uso de un objeto de la clase AffineTransform, el cual puede realizar transformaciones en secuencia, tales como una rotación seguida de un cambio de escala. Cuando una transformación se concatena con otra existente, la última que se especificó es la primera en ser aplicada. Graphics2D contiene también un método setTransform(), que sobrescribe las transformaciones a aplicar a los objetos que se vayan a dibujar pero que, ojo, no es posible usar para realizar concatenación de transformaciones. 1.2.5 Métodos de composición Cuando dos objetos se superponen en un mismo dibujo (ya sean figuras, rasgos tipográficos o imágenes) es necesario determinar qué colores renderizar en los píxeles superpuestos: este proceso se denomina composición. Las interfaces básicas de composición de Java2D son Composite and CompositeContext. Por ejemplo, para especificar el estilo de composición que debe usarse puede establecerse un objeto de la clase AlphaComposite en el contexto de un Graphics2D llamando a su método setComposite(). Las instancias de la clase AlphaComposite establecen una regla de composición que describe la manera de mezclar un nuevo color con otro ya existente definiendo, por ejemplo, transparencias. Con este objetivo, para manejar transparencias, se dispone de un valor alfa adicional al crear un objeto AlphaComposite. Este valor alfa (asociado al llamado «canal alfa» de una imagen), incrementa o decrementa el canal de transparencia del objeto según el valor que tome: si el valor de alfa es 1,0 el color será opaco, mientras que el color será totalmente transparente si vale 0,0. Por suspuesto, los valores intermedios especifican transparencias intermedias del color. Así pues, el canal alfa se usa en conjunto con un objeto de la clase Composite en el contexto de un Graphics2D para mezclar la imagen con los dibujos ya existentes. Un ejemplo de manejo de transparencias aparece en la figura 1.1. Figura 1.1. Ejemplo de transparencia 5