2012-10-28 70 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。