我正在尝试读取2个图像文件,然后将image2合并到image1之上,但下面的代码似乎不起作用。保存后,我只看到image1为原始。 这两张图片都是PNG。
String url= uploadPath + filename;
BufferedImage im = ImageIO.read(url);
String url2= "image2.png";
BufferedImage im2 = ImageIO.read(url);
Graphics2D g = im.createGraphics();
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.8f));
g.drawImage(im2, im.getWidth()/2, im.getHeight()/2, null);
g.dispose();
ImageIO.write(im, "png", new File( url ));
我在这里想念什么? 感谢
答案 0 :(得分:3)
您的问题im2
与im
完全相同:
BufferedImage im = ImageIO.read(url);
BufferedImage im2 = ImageIO.read(url);
我想这是一个错字:它应该是url2
而不是url
才能被视为im2
,我是对的吗?
BufferedImage im2 = ImageIO.read(url2);
答案 1 :(得分:3)
我没有问题让它发挥作用。
我确实找到了这条线......
g.drawImage(im2, im.getWidth()/2, im.getHeight()/2, null);
有点担心。如果图像尺寸恰到好处,可能会将图像渲染到背景图像之外。您应该使用相对于主图像的坐标...
public class MergeImages {
public static void main(String[] args) {
File inner = new File("Inner.png");
File outter = new File("Outter.png");
try {
BufferedImage biInner = ImageIO.read(inner);
BufferedImage biOutter = ImageIO.read(outter);
System.out.println(biInner);
System.out.println(biOutter);
Graphics2D g = biOutter.createGraphics();
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.8f));
int x = (biOutter.getWidth() - biInner.getWidth()) / 2;
int y = (biOutter.getHeight() - biInner.getHeight()) / 2;
System.out.println(x + "x" + y);
g.drawImage(biInner, x, y, null);
g.dispose();
ImageIO.write(biOutter, "PNG", new File("Outter.png"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
我还要仔细检查shuangwhywhy建议确保你不要在同一个文件中读两次...我在测试代码时做了一些事情:P
答案 2 :(得分:1)
您也可以尝试透明度为0.5的SRC_ATOP。