在java中叠加图像

时间:2013-01-09 16:37:50

标签: java image swing overlay jbutton

我希望你能给我一些建议来解决我的问题。 我需要在按钮上叠加许多图像。但问题是, 这是基本图像(牙齿):( http://i.imgur.com/7tIcP.gif)

我的第一张照片是这样的: http://i.imgur.com/FYuD8.gif 然后我把它: http://i.imgur.com/mWz9c.gif 第一个图像与第二个图像重叠,所以我只能看到第二个图像...

也许你会告诉我一个选项是在覆盖之前改变图像的顺序,但是用户将选择第一个是什么,也许只想要第一个图像,但在其他情况下用户将放置第一个AND然后第二个,反之亦然......

我的代码是:

    BufferedImage large=null;
    large = ImageIO.read(new File("firstimage.gif"));

    BufferedImage small=null;

    small = ImageIO.read(new File("secondimage.gif"));

    int w = Math.max(large.getWidth(), small.getWidth());
    int h = Math.max(large.getHeight(), small.getHeight());

    BufferedImage combined = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);

    // paint both images, preserving the alpha channels
    Graphics g = combined.getGraphics();
    g.drawImage(large, 0, 0, null);
    g.drawImage(small, 0, 0, null);

    ImageIO.write(combined, "PNG", new File("twoInOne.png"));

    ImageIcon icon1 = new ImageIcon(combined);
    jbutton1.setIcon(icon1);

也许是图片问题的格式,或者我的代码,但我更喜欢你们可以帮我解决这个问题谢谢你。

现在我上传了3张图片:我跳过基本图片(牙齿),因为我不认为那里会出现问题。

3 个答案:

答案 0 :(得分:3)

  

我需要编辑图片以获得透明背景吗?

要使特定颜色透明,您可以遍历BufferedImage的像素或使用合适的LookupOp。对于后者,请参阅引用的文章here。然后,您可以使用drawImage()组合图像。默认的复合规则AlphaComposite.SRC_OVER应该令人满意;如果没有,您可以更改它,如here所示。

答案 1 :(得分:1)

您的代码可以很好地将两个图像组合在一起。但是,就像你说的那样,你的两张图片大小相同,而且它们似乎没有任何透明度。这将导致第二次绘制的图像始终“覆盖”新组合图像中的第一个图像。

您可能想要的解决方案是将您想要叠加在一起的各个部分分成单独的较小图像。使用您的图像,您似乎希望在牙齿上方放置各种覆盖物以显示各种信息。在这种情况下,您需要三件事:牙齿图像,包含红色叠加层的图像和包含蓝色叠加层的图像。所有这三个图像都应该具有透明而非白色的背景,这样它们就不会覆盖任何先前绘制的图像中的颜色。当你这样做时,你会想要绘制牙齿,然后覆盖1(红色/蓝色)然后覆盖2(红色/蓝色)。这应该可以为您提供所需的输出。

答案 2 :(得分:0)

关键是将alpha设置为float值,比如说两层,将alpha设置为0.5,三层,设置alpha 0.33,四层,设置alpha 0.25 ......无论如何,这里是代码示例

try
{
    BufferedImage imgA = ImageIO.read(new File(imgAPath, token));
    BufferedImage imgB = ImageIO.read(new File(imgBPath, token));

    if (imgA.getWidth() == imgB.getWidth() && imgA.getHeight() == imgB.getHeight()) 
    {
        float alpha = 0.5f;
        int compositeRule = AlphaComposite.SRC_OVER;
        AlphaComposite ac;
        int imgW = imgA.getWidth();
        int imgH = imgA.getHeight();
        BufferedImage overlay = new BufferedImage(imgW, imgH, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = overlay.createGraphics();
        ac = AlphaComposite.getInstance(compositeRule, alpha);
        g.drawImage(imgA,0,0,null);
        g.setComposite(ac);
        g.drawImage(imgB,0,0,null);
        g.setComposite(ac);
        ImageIO.write(overlay, "PNG", new File(logFolder, browser+"__"+token));
        g.dispose();
    }
    else
    {
        System.err.println(token+" dymension not match ");
    }
}
catch (IOException e)
{
}