【问题标题】:overlay images in java在java中叠加图像
【发布时间】:2012-12-23 21:32:02
【问题描述】:

我希望你能给我一些建议来解决我的问题。 我需要在一个按钮上叠加许多图像。但问题是, 这是基本图像(牙齿):(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 张图片:我跳过了基本图片(牙齿),因为我认为这不是问题所在。

【问题讨论】:

  • 为什么代码状态为 GIF 而这两个图像都是 JPG?
  • 当用户想要两者时,应该会发生什么?它应该是什么样子?
  • Freezerburn 了解目标...第一个图像需要覆盖第二个图像而不覆盖第一个图像...
  • mm...我不明白...我发布的链接只是示例...我的原始图像是 .gif 格式
  • 所以图像 2 中不完全透明的部分(例如蓝色/红色等)应该是半透明的?

标签: java image swing overlay jbutton


【解决方案1】:

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

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

【讨论】:

  • m...如果我错了,你告诉我我需要编辑我的图像以获得透明背景?其实问题出在图片上?
  • 取决于您使用的是 Windows、Mac 还是 Linux。您需要获取图像编辑器并删除白色背景,然后最好将其保存为 PNG(允许图像透明)。 Windows 可以使用 Paint.NET,Mac 可以使用 SeaShore,而我知道的唯一适用于 Linux 的程序是 GIMP,它是 Photoshop 的替代品,因此非常复杂。
  • “实际上问题出在图像上?” 你声称它们是支持“全透明或全透明”的 GIF。该站点上的图像是 JPEG,不支持任何形式的透明度。只有 PNG 支持部分透明度,并且适合直接在另一个上绘制以同时查看两者的一部分。或许您应该将图片重新上传到imgur.com,以便我们可以正常查看。
【解决方案2】:

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

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

【讨论】:

  • 这行得通!现在我可以把这 3 张图片放在一起了,真的谢谢你垃圾神。
【解决方案3】:

关键是将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)
{
}

【讨论】:

    猜你喜欢
    • 2011-09-07
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多