it-swarm.com.de

Zwei Bilder zusammenführen

Ich muss zwei Bilder (BufferedImage) in Java zusammenführen. Es wäre kein Problem, wenn es keine Transparenz gäbe. Das Basisbild hat bereits eine gewisse Transparenz. Ich möchte dies so lassen wie es ist und eine "Maske" darauf anwenden, das zweite Bild. Dieses zweite Bild hat keine undurchsichtigen Pixel, sondern ist fast vollständig transparent. Es hat nur einige weniger transparente Pixel, um eine Art "Lichteffekt" wie einen Reflex zu erzeugen. Wichtiges Detail: Ich möchte dies nicht auf dem Bildschirm tun. Bei Grafiken muss ich ein gepuffertes Bild mit der resultierenden Zusammenführung erhalten.

Kann mir jemand helfen? Vielen Dank!

DETAILS: Fügen Sie zwei Bilder zusammen, um die Transparenz zu erhalten. Das muss ich tun.

Hinweis: Diese BufferedImage-Alphamaske in Java festlegen erledigt nicht das, was ich brauche, da sie bei zwei Bildern mit Transparenz nicht gut funktioniert - sie ändert die Transparenz des ersten Bilds.

78
GuilhermeA

Erstellen Sie einfach ein neues gepuffertes Bild mit Transparenz und malen Sie dann die beiden anderen Bilder (mit vollständiger oder halbtransparenter Transparenz) darauf. So wird es aussehen:

Image plus overlay

Beispielcode (Bilder heißen 'image.png' und 'overlay.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"));
172
Peter Walser

Ich kann Ihnen keine konkrete Antwort geben, aber Java.awt.AlphaComposite hier ist Ihr Freund. Sie erhalten die absolute Kontrolle darüber, wie die beiden Bilder zusammengeführt werden sollen. Die Verwendung ist jedoch nicht einfach - Sie müssen zuerst ein wenig Grafiktheorie lernen.

3
Steve McLeod

Ohne mehr über den Effekt zu wissen, den Sie erzielen möchten, möchte ich darauf hinweisen, dass Sie auch direkt auf ein gepuffertes Bild zugreifen können. Alles, was Sie auf dem Bildschirm tun können, können Sie direkt auf dem Bild selbst tun.

Wenn Sie also nur eines übereinander zeichnen möchten, ist das ganz einfach. Nehmen Sie einfach das Graphics-Objekt für das Basisbild und zeichnen Sie das andere darauf.

Abhängig vom genauen Effekt, den Sie erzielen möchten, funktioniert dies möglicherweise nicht. Mehr Details würden eine bessere Hilfe ermöglichen. Ist dies beispielsweise ein Job für AlphaComposite, wie der andere Antwortende erwähnt, oder ein benutzerdefiniertes ImageOp (oder eine Kombination aus vorhandenen ImageOps).

3
PSpeed