Fusión de dos imágenes


Necesito combinar dos imágenes (BufferedImage) en Java. No sería un problema si no hubiera transparencia. La imagen base ya tiene cierta transparencia. Quiero mantener esto como está y aplicarle una "máscara", la segunda imagen. Esta segunda imagen no tiene píxeles opacos, de hecho es casi completamente transparente, solo tiene algunos píxeles menos transparentes para dar una especie de" efecto de luz", como un reflejo. Detalle importante: No quiero hacer esto en pantalla, con gráficos, necesito obtener un BufferedImage con la fusión resultante.

¿Alguien puede ayudarme? ¡Gracias!

DETALLES: Combina dos imágenes manteniendo la transparencia. Esto es lo que necesito hacer.

Nota: este Set BufferedImage alpha mask en Java no hace lo que necesito porque no se maneja bien con las dos imágenes que tienen transparencia - modifica la transparencia de la primera imagen.

Author: Community, 2010-02-23

3 answers

Simplemente cree una nueva imagen de búfer con transparencia, luego pinte las otras dos imágenes (con transparencia completa o semitransparente) en ella. Así es como se verá:

Imagen más superposición

Código de ejemplo (las imágenes se llaman ' imagen.png' y 'superposición.png"):

File path = ... // base path of the images

// load source images
BufferedImage image = ImageIO.read(new File(path, "image.png"));
BufferedImage overlay = ImageIO.read(new File(path, "overlay.png"));

// create the new image, canvas size is the max. of both image sizes
int w = Math.max(image.getWidth(), overlay.getWidth());
int h = Math.max(image.getHeight(), overlay.getHeight());
BufferedImage combined = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);

// paint both images, preserving the alpha channels
Graphics g = combined.getGraphics();
g.drawImage(image, 0, 0, null);
g.drawImage(overlay, 0, 0, null);

// Save as new image
ImageIO.write(combined, "PNG", new File(path, "combined.png"));
 162
Author: Peter Walser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-06 00:53:54

Sin saber más sobre el efecto que está tratando de lograr, solo señalaré que también puede dibujar a la derecha en una imagen de búfer. Así que cualquier cosa que puedas hacer en la pantalla puedes hacerlo directamente en la propia imagen.

Así que si todo lo que quieres es uno dibujado encima del otro, eso es muy fácil. Simplemente agarra el objeto Gráfico de la imagen base y dibuja el otro sobre él.

De nuevo, dependiendo del efecto exacto que usted está buscando que puede no funcionar. Más detalles permitirían mejor ayudar. Por ejemplo, es este un trabajo para AlphaComposite como menciona el otro respondedor o un ImageOp personalizado (o alguna combinación de ImageOps existentes).

 3
Author: PSpeed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-23 12:54:54

No puedo darte una respuesta específica, pero java.awt.AlphaComposite aquí es tu amigo. Obtendrá un control absoluto sobre cómo desea que las dos imágenes se fusionen. Sin embargo, no es fácil de usar, primero debe aprender un poco de teoría de gráficos.

 2
Author: Steve McLeod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-23 12:43:49