0

我正在尝试读取 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 ));

我在这里错过了什么?谢谢

4

3 回答 3

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

于 2013-02-02T06:47:54.527 回答
3

您的问题与以下im2内容完全相同im

BufferedImage im = ImageIO.read(url);
BufferedImage im2 = ImageIO.read(url);

我想这是一个错字:应该是url2而不是url被读作im2,对吗?

BufferedImage im2 = ImageIO.read(url2);
于 2013-02-02T03:10:18.593 回答
1

您也可以尝试透明度为 0.5 的 SRC_ATOP。

于 2013-02-02T13:29:40.660 回答