2013-01-09 79 views
1

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

我的第一个图像是这个: 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张图片:我跳过基本图片(牙齿),因为我不认为它会是那里的问题。

+0

为什么代码状态GIF而这两个图像都是JPG? –

+0

当用户同时需要时,*应该发生什么?它应该是什么样子? –

+0

Freezerburn了解目标...第一个图像需要覆盖第二个图像,而不会覆盖第一个图像... –

回答

3

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

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

+0

这个工程!现在我可以把3张图片放在一起真的很感谢你的垃圾桶。 –

1

您的代码应该很好,可以将两个图像组合在一起。然而,正如你所说,你的两幅图像尺寸相同,而且它们似乎没有任何透明度。这将导致第二个绘制的图像总是“覆盖”新组合图像中的第一个图像。

您可能需要的解决方案是将您想叠加在一起的各个部分拆分为单独的较小图像。用你的图像,它看起来像你想在牙齿顶部有各种覆盖层来显示各种信息。在这种情况下,你需要做三件事情:牙齿的图像,包含红色覆盖图的图像和包含蓝色覆盖图的图像。所有这三个图像应该有一个透明的,而不是白色的背景,以便它们不会覆盖任何先前绘制的图像中的颜色。当你这样做时,你需要绘制牙齿,然后覆盖1(红/蓝),然后覆盖2(红/蓝)。这应该让你找到你想要的输出。

+0

米...如果我错了,你告诉我,我需要编辑我的图像,以获得透明背景?其实问题是图像? –

+0

取决于您是在Windows,Mac还是Linux。你需要得到一个图像编辑器,并删除白色背景,然后最好将它保存为一个PNG(它允许在图像中的透明度)。 Windows可以使用Paint.NET,Mac可以使用SeaShore,而我所知道的Linux的唯一程序是GIMP,它是一个Photoshop替代品,所以它非常复杂。 – Freezerburn

+0

*“事实上问题是图像?”*您声称他们是GIF,它支持“全部或无透明度”。该网站上的图像是JPEG,不支持任何形式的透明度。只有PNG支持部分透明度,并且适合直接在另一个上绘制,以便同时查看两者的部分内容。也许你应该将图像重新上传到http://imgur.com/,以便我们可以正确地看到它们。 –

0

关键是要设置alpha浮动值,说两层,设置阿尔法至0.5,三层,设置阿尔法0.33,四层,设置阿尔法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) 
{ 
}