sábado, 11 de febrero de 2012

Generar Imágenes Compuestas con SWT

Siempre había pensado que combinar una imagen a partir de otras dos era una tarea no demasiado complicada, sobretodo cuando la mayoría hemos pasado por Java Swing... no obstante, al ir a hacerlo con SWT me encontré sin la suficiente información como para hacerlo.

Es por ello que he decidido hacer esta entrada sencilla, simplemente para poner un ejemplo de cómo se componen las imágenes en SWT. Para llevarlo a cabo necesitaremos utilizar el Graphics Context de SWT (GC). Y seguiremos los siguientes pasos:

  1. Crearemos una imagen con un tamaño específico con:
    Image compoundImage = new Image(Display.getDefault(), 22,22);
  2. Utilizaremos el contexto gráfico de la propia imagen para dibujar las imágenes con su offset:
GC gc = new GC(compoundImage );
 gc.drawImage(image1, 0, 0);
 gc.drawImage(image2, 6, 6);
Una vez hecho esto ya tendremos la imagen que queremos en compoundImage, que será una composición de las imágenes image1 y image2.

Observaciones

  1. A partir del gc de la imagen podremos dibujar lo que queramos encima de la imagen, ya sea texto, lineas, figuras...
  2. Una imagen creada, siempre la tendremos que liberar manualmente haciendo un compoundImage.dispose(), para no quedarnos sin handlers en el Sistema Operativo

2 comentarios:

  1. Si realizamos esta composición de imágenes nos daremos cuenta que por defecto el resultado es una imagen opaca con el fondo blanco.

    La clase ImageData nos permite, a través de su atributo "transparentPixel", definir un color de pixel que será eliminado de la imagen consiguiendo así un área transparente en la misma. Si queremos por tanto que sea transparente el fondo de nuestra imagen compuesta deberemos incluir las siguientes lineas de código para eliminar los pixels blancos:

    ImageData imageData = compoundImage.getImageData();

    imageData.transparentPixel = compoundImage.getImageData().palette.getPixel(new RGB(255,255,255));

    Image transparentImage = new Image(Display.getDefault(), imageData);

    ResponderEliminar