-1

通常、src_in AlphaComposite を示すアプリケーションを作成しようとしています。必要な出力は次のとおりです。

ここに画像の説明を入力

しかし、私は次の出力を得ています:- ここに画像の説明を入力

私はどこで間違いをしていますか?これが私の完全なコードです。

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();}});
}
}
4

2 に答える 2

0

長い研究と検索の後、私は私の問題の解決策を見つけたようです.間違っている場合は修正してください.ここに行きます:-

TYPE_INT_ARGB は、背景が透明な画像の場合に使用されます。TYPE_INT_ARGB は、画像の背景が透明であることをプログラムに伝えます。使用しない場合、画像は長方形 (白い背景 + 画像) と見なされます。私のプログラムでは、ランドスケープ画像もシールド画像の外側に表示されました。実際にはシールド画像の外側ではありませんでしたが、シールド画像が長方形の画像(シールド+白い背景)と見なされるようになったため、内側にありました。黒い背景の理由も同じでしたシャドー ケースでは。したがって、TYPE_INT_ARGB を使用する必要があります。

于 2012-10-29T14:19:11.390 に答える
0

Filthy Rich Clients からサンプルをダウンロードして実行しましたが、問題はありません。コードが同一であることを考えると、問題は画像にあることをお勧めします。

アルファ合成は、画像のアルファ チャネルで機能します。

たとえば、盾の画像を次のように変更すると... (アルファ 50% の赤)

ここに画像の説明を入力

私は結局...

ここに画像の説明を入力

于 2012-10-28T22:04:58.450 に答える