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();
        }

    }
}

また、同じファイルを2回読み取らないようにするというshuangwhywhyの提案を再確認します...コードをテストするときに何かをしました:P

于 2013-02-02T06:47:54.527 に答える
3

あなたの問題はim2まったく同じimです:

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

私はそれがタイプミスだと思います:それは、「私は正しいですか?」と読むのurl2ではなく、そうあるべきです。urlim2

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

透明度0.5でSRC_ATOPを試すこともできます。

于 2013-02-02T13:29:40.660 に答える