Łączenie dwóch obrazów

Muszę połączyć dwa obrazy (BufferedImage) w Javie. Nie byłoby problemu, gdyby nie było przejrzystości. Obraz bazowy ma już pewną przezroczystość. Chcę zachować to tak, jak jest i nałożyć na to" maskę", drugi obraz. Ten drugi obraz nie ma nieprzezroczystych pikseli, w rzeczywistości jest prawie całkowicie przezroczysty, po prostu ma mniej przezroczyste piksele, aby dać jakiś "efekt świetlny", jak odruch. Ważny szczegół: nie chcę tego robić na ekranie, z Grafiką, muszę uzyskać BufferedImage z wynikowym scaleniem.

Czy ktoś może mi pomóc? Dzięki!

Szczegóły: połącz dwa obrazy z zachowaniem przejrzystości. To jest to, co muszę zrobić.

Uwaga: Taustawiona Maska Alfa BufferedImage w Javie nie robi tego, czego potrzebuję, ponieważ nie radzi sobie dobrze z dwoma obrazami o przezroczystości - modyfikuje przezroczystość pierwszego obrazu.

Author: Community, 2010-02-23

3 answers

Po prostu utwórz nowy obraz BufferedImage z przezroczystością, a następnie namaluj na nim dwa pozostałe obrazy (z pełną lub półprzezroczystością). Tak to będzie wyglądało:

Nakładka Image plus

Przykładowy kod (obrazy nazywane są ' image.nakładka png' i'.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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-06 00:53:54

Nie wiedząc więcej o efekcie, który próbujesz osiągnąć, zwrócę tylko uwagę, że możesz również rysować bezpośrednio na Buforedimage. Więc wszystko, co możesz zrobić na ekranie, możesz zrobić bezpośrednio na samym obrazie.

Więc jeśli chcesz tylko jeden narysowany na drugim, to naprawdę proste. Wystarczy chwycić obiekt graficzny dla obrazu podstawowego i narysować na nim drugi.

Ponownie, w zależności od dokładnego efektu, który zamierzasz osiągnąć, może to nie zadziałać. Więcej szczegółów pozwoli lepiej pomocy. Na przykład, czy jest to zadanie dla AlphaComposite, jak wspomina inny responder, lub niestandardowy ImageOp (lub jakaś kombinacja istniejących ImageOps).

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-23 12:54:54

Nie mogę dać konkretnej odpowiedzi, ale java.awt.AlphaComposite to twój przyjaciel. Uzyskasz absolutną kontrolę nad tym, jak chcesz połączyć oba obrazy. Jednak nie jest to proste w użyciu - najpierw musisz nauczyć się trochę teorii Grafiki.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-23 12:43:49