Объединение двух изображений

Мне нужно объединить два изображения (BufferedImage) в Java. Это не было бы проблемой, если бы не было прозрачности. У базового изображения уже есть прозрачность. Я хочу сохранить это как есть и применить к нему "маску", второе изображение. На этом втором изображении нет непрозрачных пикселей, на самом деле он почти полностью прозрачен, имеет несколько менее прозрачных пикселей, чтобы дать какой-то "световой эффект", как рефлекс. Важная деталь: я не хочу делать это на экране, с графикой, мне нужно получить BufferedImage с результирующим слиянием.

Может ли кто-нибудь мне помочь? Спасибо!

ДЕТАЛИ: Слияние двух изображений, поддерживающих прозрачность. Это то, что мне нужно сделать.

Примечание: эта Установите альфа-маску BufferedImage в Java не делает то, что мне нужно, потому что она плохо справляется с обоими изображениями с прозрачностью - она ​​изменяет прозрачность первого изображения.

Ответ 1

Просто создайте новый BufferedImage с прозрачностью, затем нарисуйте на нем два других изображения (с полной или полупрозрачностью). Вот как это будет выглядеть:

Изображение плюс наложение

Пример кода (изображения называются "image.png" и "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"));

Ответ 2

Я не могу дать вам конкретный ответ, но java.awt.AlphaComposite здесь ваш друг. Вы получите абсолютный контроль над тем, как вы хотите, чтобы два изображения слились. Однако это не так просто - сначала вам нужно изучить немного теории графики.

Ответ 3

Не зная больше о эффекте, который вы пытаетесь достичь, я просто укажу, что вы также можете рисовать на BufferedImage. Так что все, что вы могли бы сделать на экране, вы можете сделать прямо на самом изображении.

Итак, если все, что вам нужно, это нарисовать поверх другого, это очень просто. Просто возьмите объект Graphics для базового изображения и нарисуйте на нем другое.

Опять же, в зависимости от точного эффекта, который вы собираетесь делать, это может не сработать. Более подробная информация позволит лучше помочь. Например, это задание для AlphaComposite, как упоминает другой ответчик, или пользовательский ImageOp (или некоторая комбинация существующего ImageOps).