2012-10-28 72 views
-1

我試圖讓這通常表明了SRC_IN我需要AlphaComposite.The輸出是一個應用程序: -需要幫助糾正我的Swing應用程序輸出

enter image description here

但我得到以下的輸出: - enter image description here

我在哪裏做錯了?這是我的完整代碼。

import java.awt.AlphaComposite; 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Composite; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.JCheckBox; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 


public class SrcInDemo extends JFrame{ 
private JCheckBox jcb; 
SrcInDemo() 
{ 
super("SrcIn Demonstration"); 
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
setSize(600,600); 

add(new comp(),BorderLayout.CENTER); 

setVisible(true); 
add(jcb=new JCheckBox("Shadow"),BorderLayout.SOUTH); 
jcb.addChangeListener(new ChangeListener(){ 

    @Override 
    public void stateChanged(ChangeEvent e) { 
     // TODO Auto-generated method stub 
     repaint(); 
    }}); 
} 
class comp extends JComponent 
{ 
private BufferedImage image,landscape; 
comp() 
{ 
    try{ 
    image=ImageIO.read(/*getClass().getResource("picture.png")*/new File("src/picture.png")); 
    landscape=ImageIO.read(/*getClass().getResource("landscape.jpg")*/new File("src/landscape.jpg")); 
    }catch(IOException e){System.out.printf("error loading image");} 
} 
public void paintComponent(Graphics g) 
{ 
//The following commented lines were there in the original code of Filthy Rich Clients 
//But I have removed them as it was supposed to create a back image.I have created g2 
//directly. 
      /* BufferedImage temp = new BufferedImage(getWidth(), getHeight(), 
      BufferedImage.TYPE_INT_ARGB); 
     Graphics2D g2 = temp.createGraphics();*/ 

    Graphics2D g2=(Graphics2D)g.create(); 
    if(jcb.isSelected()) 
    { 
     int x=(getWidth()-image.getWidth())/2; 
     int y=(getHeight()-image.getHeight())/2; 
     g2.drawImage(image,x+4,y+4,null); 

     Composite oldComposite=g2.getComposite(); 
     g2.setComposite(AlphaComposite.SrcIn); 
     g2.setColor(Color.BLACK); 
     g2.fillRect(0,0,getWidth(),getHeight()); 
     g2.setComposite(oldComposite); 
     g2.drawImage(image,x,y,null); 
    } 
    else 
    { 
     int x=(getWidth()-image.getWidth())/2; 
     int y=(getHeight()-image.getHeight())/2; 
     g2.drawImage(image,x,y,null); 
     Composite oldComposite=g2.getComposite(); 
     g2.setComposite(AlphaComposite.SrcIn); 
     g2.drawImage(landscape,x,y,null); 
     g2.setComposite(oldComposite); 
    } 
      //g.drawImage(temp, 0, 0, null); 
} 
} 

public static void main(String args[]) 
{ 
SwingUtilities.invokeLater(new Runnable(){public void run(){new SrcInDemo();}}); 
} 
} 
+0

我不是在PC面前嘗試,但我懷疑複合材料應該在渲染的第二階段應用 – MadProgrammer

回答

0

我已經從Filthy Rich Clients下載了這些例子,並且運行這些例子並且沒有問題。鑑於你的代碼是相同的,我會建議你的圖片存在問題。

Alpha複合材料在圖像的alpha通道上工作。

例如,如果我改變屏蔽圖像看起來像...(紅色用50%α)

enter image description here

我最終...

enter image description here

+0

:我已經在上面的代碼中添加了一些行,富客戶端,但我刪除了它們。但是,我不刪除它們並運行,然後它工作正常。 (請參閱編輯代碼) –

+0

***我已發佈1個回答請檢查並讓我有你的建議*** 和一個小問題WRT這個問題的答案:-is有任何其他方式來獲得TYPE_INT_ARGB的相同 效果Graphics2D對象,而不是 創建BufferedImage.Like上,如果我已經有了G2 對象,現在在以後一段時間我想設置 TYPE_INT_ARGB就可以了。 順便說一句,在我看來TYPE_INT_ARGB是定義爲圖像和 它與g2無關,所以不應該有任何 的方式。 –

+0

您不能更改飛行的圖形對象(使其成爲TYPE_ARG)。您可以用透明顏色清除組件圖形,但對於來自不透明的緩衝圖像的圖形不起作用 – MadProgrammer

0

看來,經過長期的研究和搜索,我發現了一個解決我的問題。請糾正,如果我錯了。我們去: -

TYPE_INT_ARGB用於具有透明背景的圖像.TYPE_INT_ARGB告訴程序我們的圖像具有透明背景。如果我們不使用它,那麼圖像被認爲是矩形(白色背景+圖像)。這就是爲什麼在我的程序中,風景圖像也出現在屏蔽圖像之外。事實上,它不在屏蔽圖像之外,但是現在屏蔽圖像被認爲是矩形圖像(盾+白色背景)。同樣是黑色背景在陰影case.Hence我必須使用TYPE_INT_ARGB。