Слияние двух изображений


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

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

детали: слияние двух изображений с сохранением прозрачности. Вот что мне нужно сделать.

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

3 74

3 ответа:

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

Image plus overlay

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

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

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

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

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