2013-01-09 119 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) 
{ 
}