我有多个透明的BufferedImage
个实例,我想将它们叠加在一起(也就是Photoshop图层)并烘焙成一个BufferedImage
输出。我该怎么做?
答案 0 :(得分: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);
答案 1 :(得分:2)
让我们假设第一个BufferedImage命名为bi1,第二个bi2命名为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,以便打开alpha。如果两者加在一起超过最大整数,这可能无法给出您想要的确切结果,因此您可能需要添加一些内容来帮助解决这个问题。像素使用位移来添加颜色,整数排序为AARRGGBB。
答案 2 :(得分:2)
还要考虑图形上下文可用的AlphaComposite
模式,讨论here。