2010-02-23 13 views
72

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 das so behalten wie es ist und eine "Maske" darauf anwenden, das zweite Bild. Dieses zweite Bild hat keine undurchsichtigen Pixel, es ist sogar fast vollständig transparent, hat nur einige weniger transparente Pixel, um einen "Lichteffekt" zu erzeugen, wie einen Reflex. Wichtiges Detail: Ich möchte das nicht auf dem Bildschirm machen, mit Grafiken muss ich ein BufferedImage mit der resultierenden Zusammenführung erhalten.Zwei Bilder zusammenfügen

Kann mir jemand helfen? Danke!

DETAILS: Mischen Sie zwei Bilder, die Transparenz beibehalten. Das muss ich tun.

Hinweis: diese Set BufferedImage alpha mask in Java tut nicht, was ich brauche, weil es nicht gut mit den zwei Bildern mit Transparenz behandelt - es ändert ersten Bild Transparenz.

Antwort

155

Erstellen Sie einfach ein neues BufferedImage mit Transparenz, dann malen Sie die anderen zwei Bilder (mit voller oder halbtransparenter) darauf. Diese ist, wie es aussehen wird:

Image plus overlay

Beispielcode (Bilder genannt werden '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")); 
+0

Gibt es Möglichkeit, die zweite haben Bild in der Mitte des ersten? – Ahmed

+3

Sollten Sie nicht aufrufen g.dispose(); Am Ende? –

+0

Hallo, ich folgte diesem Ansatz und speichern nur das zweite Bild, aber nicht das erste Bild ... Jede Hilfe hier würde geschätzt werden. –

2

Ich kann Ihnen keine spezifische Antwort geben, aber java.awt.AlphaComposite hier ist dein Freund. Sie erhalten die absolute Kontrolle darüber, wie die beiden Bilder zusammengeführt werden sollen. Es ist jedoch nicht einfach zu bedienen - Sie müssen zuerst ein bisschen Grafik-Theorie lernen.

2

Ohne mehr über den Effekt zu wissen, den Sie erreichen möchten, werde ich nur darauf hinweisen, dass Sie auch direkt auf BufferedImage zeichnen können. Alles, was Sie auf dem Bildschirm tun können, können Sie direkt auf dem Bild selbst tun.

Also, wenn alles was du willst ist eine, die auf die andere gezeichnet ist, das ist wirklich einfach. Greifen Sie einfach das Graphics-Objekt für das Basisbild und zeichnen Sie das andere darauf.

Noch einmal, je nach dem genauen Effekt, den Sie anstreben, kann das nicht funktionieren. Mehr Details würden bessere Hilfe ermöglichen. Zum Beispiel, ist dies ein Job für AlphaComposite, wie der andere Responder erwähnt oder ein benutzerdefiniertes ImageOp (oder eine Kombination von bestehenden ImageOps).