Вопрос по java, bufferedimage – Слой нескольких BufferedImages друг на друга?

3

У меня несколько прозрачныхBufferedImage экземпляры, которые я хотел бы наложить друг на друга (или слои Photoshop) и выпекать в одинBufferedImage выход. Как мне это сделать?

Ваш Ответ

3   ответа
1

Давайте притворимся, что первый BufferedImage назван bi1, а второй bi2, в то время как изображение, на которое вы хотите наложить их, является целью.

BufferedImage target=new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB);
Graphics2D targetGraphics=target.createImage();
targetGraphics.drawImage(bi1,0,0,null);//draws the first image onto it

int[] pixels2=((DataBufferInt) bi2.getRaster().getDataBuffer()).getData();
int[] pixelsTgt=((DataBufferInt) target.getRaster().getDataBuffer()).getData();
for(int a=0;a<pixels2.length;a++)
{
     pixelsTgt[a]+=pixels2[a];//this adds the pixels together
}

Убедитесь, что все три объекта BufferedImage имеют тип TYPE_INT_ARGB, чтобы была включена альфа. Это может не дать вам точных результатов, которые вы хотели получить, если их сложение превышает максимальное целое число, поэтому вы можете захотеть добавить что-нибудь, чтобы исправить это. Пиксели используют сдвиги битов для добавления к цветам с целым числом, упорядоченным как AARRGGBB.

2

Также рассмотримAlphaComposite режимы, доступные для графического контекста, обсуждаютсяВот.

изображение http://i52.tinypic.com/ndo51u.png

10

Я бы сказал, что лучше всего взять буферизованные изображения и создать дополнительное, чтобы иметь объект для добавления. Затем просто используйте Graphics.drawImage (), чтобы поместить их друг на друга.

Итак, что-то вроде этого:

BufferedImage a = ImageIO.read(new File(filePath, "a.png"));
BufferedImage b = ImageIO.read(new File(filePath, "b.png"));
BufferedImage c = new BufferedImage(a.getWidth(), a.getHeight(), BufferedImage.TYPE_INT_ARGB);

Graphics g = c.getGraphics();
g.drawImage(a, 0, 0, null);
g.drawImage(b, 0, 0, null);
Я не нашелGraphics#draw метод. я использовалGraphics#drawImage.
Вот Это Да! Я не могу поверить, что вы первый человек, который указал на это после всего этого времени. Я обновлю ответ, чтобы он не вводил других в заблуждение.

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