Convertir a transparente el color de una imagen en Java

por Mar 29, 2020Desarrollo de Software0 Comentarios

Hace poco publiqué un artículo para hacer la rotación de una imagen en Java. Al hacer la rotación la imagen se queda dentro de un rectángulo y quedan zonas en negro. En este artículo vamos a ver como convertir a transparente el color de una imagen en Java.

Lo que necesitamos es convertir un color determinado de la imagen en transparente. Hay que tener en cuenta que la zona de no datos de la imagen debe tener un color que no aparezca mucho en la imagen porque también se convertirá a transparente. Se suele usar o el negro o el blanco para esta tarea.

Para hacer convertir a transparente un color de una imagen en Java hay que tener en cuenta que el BufferedImage de destino ha de ser del tipo TYPE_INT_ARGB.

Luego se ha de crear un objeto del tipo RGBImageFilter en el que sobreescribiremos el método filterRGB.

Lo que haremos será identificar el color que se quiere hacer transparente y posteriormente el filtro comprobará cada pixel de la imagen y si coincide con la marca lo hará transparente.

Esto lo pueden poner dentro de una clase como la que les muestro a continuación, o también se podría haber hecho con un simple método estático.

public class TransparentTransformation {

    private BufferedImage img;

    public TransparentTransformation(BufferedImage img) {
        this.img = img;
    }

    public BufferedImage makeColorTransparent(final Color color) {
        BufferedImage imgDestination;
        ImageFilter filter = new RGBImageFilter() {
            // the color we are looking for... Alpha bits are set to opaque
            public int markerRGB = color.getRGB() | 0xFF000000;

            @Override
            public final int filterRGB(int x, int y, int rgb) {
                if ((rgb | 0xFF000000) == markerRGB) {
                    // Mark the alpha bits as zero - transparent
                    return 0x00FFFFFF & rgb;
                } else {
                    // nothing to do
                    return rgb;
                }
            }
        };

        ImageProducer ip = new FilteredImageSource(img.getSource(), filter);
        Image img = Toolkit.getDefaultToolkit().createImage(ip);
        imgDestination = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2dImg = imgDestination.createGraphics();
        g2dImg.drawImage(img, 0, 0, null);
        g2dImg.dispose();

        return imgDestination;
    }
}

Ahora, cada vez que queramos hacer transparente un determinado color de una imagen habrá que hacer lo que se muestra en el siguiente código.

TransparentTransformation transparent = new TransparentTransformation(destinationImage);
BufferedImage destinationImage = transparent.makeColorTransparent(new Color(0, 0, 0));

Si se quiere guardar la imagen en formato PNG (admite transparencia), será algo tan sencillo como usar la clase ImageIO de Java.

private void savePNGImage(BufferedImage im) throws IOException {
	ImageIO.write(im, "PNG", new File("imagen.png"));
}

Con esto quedaría todo resuelto y ya tienen una manera de hacer transparente un color de una imagen en Java.


Quedo a vuestra disposición para cualquier duda en los comentarios.