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

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

Кто-либо может помочь мне?Спасибо!

Подробнее: Объедините два изображения, поддерживающие прозрачность. Это - то, что я должен сделать.

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

79
задан Community 23 May 2017 в 12:02
поделиться

3 ответа

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

Image plus overlay

Пример кода (изображения называются '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"));
173
ответ дан 24 November 2019 в 10:10
поделиться

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

3
ответ дан 24 November 2019 в 10:10
поделиться

внесите эти изменения в стиль div

  1. z-index: 100; более высокое значение гарантирует, что этот элемент находится выше всего
  2. положения: фиксированного; это гарантирует, что даже при выполнении прокрутки

div лежит сверху и всегда виден

-121--237816-
  1. Я не думаю, что код может знать, что он отлаживается, за исключением косвенных (и ненадежных) средств, таких как измерение, сколько времени занимает выполнение кодовых последовательностей.

  2. Невозможно отключить все трассы стеков. можно отключить трассировку для классов исключений, которые вы сами определяете, путем переопределения Throwable.fillInStackTrace () , чтобы ничего не делать. Но это не сработает для классов, которые вы не можете изменить.

Но если вы думаете сделать это, чтобы предотвратить обратное проектирование, вы бы потратили свое время, даже если бы вы могли это сделать. Хакеру было бы просто идентифицировать код вашего приложения против обратного проектирования и отредактировать соответствующие файлы байт-кода, чтобы отключить его.

EDIT - Я пересмотрел свое мнение о том, что вы пытаетесь сделать. Учитывая, что вы делаете то, что распространяете SDK, который, как вы ожидаете, ваши клиенты будут встраивать в свои собственные приложения, отключение stacktraces для всего приложения Java считается враждебным поведением клиента , IMO. В качестве побочного эффекта защиты вашего «драгоценного» IP-адреса вы затрудняете для клиента/разработчика отладку ее собственного кода. Даже код, который не имеет ваших ценных методов в стеке вызовов!

Если бы я был клиентом, я бы предпочел, чтобы вы отправили запутанный код, чем это. Но, скорее всего, я бы ОЧЕНЬ ПОСТАРАЛСЯ найти альтернативного поставщика программного обеспечения, который не считал своих клиентов-плательщиков ворами .

-121--3823312-

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

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

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

3
ответ дан 24 November 2019 в 10:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: