2

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

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

也许您会告诉我一个选项是在叠加之前更改图像的顺序,但是用户会选择第一个图像,也许只是想要第一个图像,但在其他情况下,用户将放置第一个然后是第二个或反之亦然...

我的代码是这样的:

    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 张图片:我跳过了基本图片(牙齿),因为我认为这不是问题所在。

4

3 回答 3

4

我需要编辑我的图像以获得透明背景?

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

于 2013-01-09T20:52:35.637 回答
1

您的代码应该可以将两个图像组合在一起。但是,就像您说的,您的两个图像大小相同,并且它们似乎没有任何透明度。这将导致第二个绘制的任何图像总是“覆盖”新组合图像中的第一个图像。

您可能想要的解决方案是将要叠加的各个部分分解为单独的较小图像。对于您的图像,您似乎希望在牙齿顶部有各种叠加层以显示各种信息。在这种情况下,您需要拥有三样东西:牙齿图像、包含红色覆盖层的图像和包含蓝色覆盖层的图像。所有这三个图像都应该具有透明而不是白色的背景,这样它们就不会覆盖任何先前绘制的图像中的颜色。执行此操作时,您需要绘制牙齿,然后覆盖 1(红色/蓝色),然后覆盖 2(红色/蓝色)。这应该可以为您提供所需的输出。

于 2013-01-09T16:47:44.280 回答
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)
{
}
于 2016-05-18T16:32:59.693 回答