En informática , Java 2D es una API para dibujar gráficos bidimensionales utilizando el lenguaje de programación Java . Cada operación de dibujo de Java 2D se puede tratar en última instancia como rellenar una forma con una pintura y componer el resultado en la pantalla .
Organización
La API de Java 2D y su documentación están disponibles para su descarga como parte de JDK 6. Las clases de la API de Java 2D están organizadas en los siguientes paquetes en JDK 6:
java.awt
El paquete principal para Java Abstract Window Toolkit .java.awt.geom
La biblioteca estándar de Java de formas geométricas bidimensionales como líneas, elipses y cuadriláteros.java.awt.font
La biblioteca para manipular glifos en Java.java.awt.color
La biblioteca que se ocupa de las diferentes formas en que se puede representar el color.java.awt.image
La biblioteca para manipular imágenes gráficas.java.awt.print
La biblioteca de herramientas para escribir en papel.
Conceptos básicos
Estos objetos son una parte necesaria de todas las operaciones de dibujo 2D de Java.
Formas
Una forma en Java 2D es un límite que define un interior y un exterior. Los píxeles dentro de la forma se ven afectados por la operación de dibujo, los que están fuera no.
Si intenta llenar un segmento de línea recta , no se verán afectados los píxeles, ya que dicha forma no contiene píxeles en sí. En su lugar, se debe usar un rectángulo delgado para que la forma contenga algunos píxeles.
Pinturas
Una pintura genera los colores que se utilizarán para cada píxel de la operación de relleno. La pintura más simple es la java.awt.Color
que genera el mismo color para todos los píxeles. Las pinturas más complicadas pueden producir degradados, imágenes o incluso cualquier combinación de colores. Rellenar una forma circular con el color amarillo da como resultado un círculo amarillo sólido, mientras que rellenar la misma forma circular con una pintura que genera una imagen produce un recorte circular de la imagen.
Composicion
Durante cualquier operación de dibujo, hay una fuente (los píxeles que produce la pintura) y un destino (los píxeles que ya están en pantalla). Normalmente, los píxeles de origen simplemente sobrescriben los píxeles de destino, pero el compuesto permite cambiar este comportamiento.
El compuesto, dados los píxeles de origen y destino, produce el resultado final que finalmente termina en pantalla. El compuesto más común es java.awt.AlphaComposite
, que puede tratar los píxeles que se dibujan como parcialmente transparentes, de modo que los píxeles de destino se muestren hasta cierto punto.
Relleno
Para rellenar una forma, el primer paso es identificar qué píxeles caen dentro de la forma. Estos píxeles se verán afectados por la operación de relleno. Los píxeles que están parcialmente dentro y parcialmente fuera de la forma pueden verse afectados en menor grado si el suavizado está habilitado.
A continuación, se solicita a la pintura que genere un color para cada uno de los píxeles que se van a pintar. En el caso común de un relleno de color sólido, cada píxel se configurará con el mismo color.
El compuesto toma los píxeles generados por la pintura y los combina con los píxeles que ya están en pantalla para producir el resultado final.
Objetos avanzados
Se puede considerar que estos objetos realizan sus funciones en términos de los objetos más simples descritos anteriormente.
Transformar
Cada operación de Java 2D está sujeta a una transformación , de modo que las formas se pueden trasladar, rotar, cortar y escalar a medida que se dibujan. La transformación activa suele ser la transformación de identidad , que no hace nada.
Rellenar usando una transformación puede verse como simplemente crear una nueva forma transformada y luego rellenar esa forma.
Carrera
Además de la operación de relleno , Java 2D proporciona una operación de dibujo . Mientras que relleno dibuja el interior de una forma, dibujar dibuja su contorno. El contorno puede ser tan simple como una línea delgada o tan complicado como una línea discontinua, y cada trazo tiene bordes redondeados.
El objeto responsable de generar el contorno es el trazo . Dada una forma de entrada, el trazo produce una nueva forma que representa su contorno. Por ejemplo, un segmento de línea infinitamente delgado (sin interior) podría trazarse en un rectángulo de un píxel de ancho.
Por lo tanto, una operación de dibujo se puede describir como la creación de un nuevo objeto trazado y luego llenar ese objeto.
Técnicamente hablando, el trazo solo es necesario para aceptar una forma de entrada y producir una nueva forma. La implementación de trazo proporcionada con Java 2D implementa las reglas de esquema descritas anteriormente, pero un trazo escrito a medida podría producir cualquier forma que desee.
Optimizaciones
Conceptualmente, dibujar una línea negra recta en Java 2D se puede pensar como crear un segmento de línea, transformarlo de acuerdo con la transformación actual, acariciarlo para crear un rectángulo delgado, consultar esta forma para calcular los píxeles afectados, generar los píxeles usando java.awt.Color.BLACK
y luego componer los resultados en la pantalla.
Sin embargo, realizar toda esta secuencia de pasos para cada operación de dibujo sería muy ineficaz. Por lo tanto, Java 2D optimiza las operaciones de dibujo comunes para que se puedan omitir muchos de estos pasos. Si la pintura es de un color sólido simple, por ejemplo, no hay necesidad de ordenarle que genere una lista de colores para pintar. Del mismo modo, si se utiliza el compuesto totalmente opaco predeterminado, pedirle que realice la operación de composición es innecesario y supondría una pérdida de esfuerzo.
Java 2D realiza la cantidad mínima de trabajo necesaria para que parezca que está realizando todos estos pasos para cada operación y, por lo tanto, conserva una gran flexibilidad y un alto rendimiento.
Destino
Para simplificar, los ejemplos textuales proporcionados en este artículo han asumido que la pantalla es el dispositivo de destino. Sin embargo, el destino puede ser cualquier cosa, como una impresora, una imagen de memoria o incluso un objeto que acepta comandos de gráficos 2D de Java y los traduce en archivos de imágenes de gráficos vectoriales .
Interoperabilidad Java2D / OpenGL
Desde Java SE 6 , Java2D y OpenGL se han vuelto interoperables, lo que permite, por ejemplo, dibujar gráficos animados en 3D en lugar de iconos en un botón (ver JOGL ).