1

透明度のあるPNG画像があります。透明度とアルファ マスクをサポートできるのは PNG のみであるため、この形式を使用しました。

私の目的は、この画像で JPanel をペイントし、透明な領域に下のパネルの色を持たせ、最終的に画像でいくつかのアニメーションを実行することです。

どんなに問題に直面しても、JPanel にロードしてペイントすると、透明な領域が真っ白になります。

では、Java は透明な画像をサポートしていませんか?

class imgpanel extends JPanel{
BufferedImage image,backg;
imgpanel(){
    try {
              image = ImageIO.read(new File("theimage.png"));
              backg = ImageIO.read(new File("backimage.png"));
           } catch (IOException ex) {
                System.out.println("No image found");
   }
    setPreferredSize(new Dimension(400,300));
}
 @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(backg,0,0,null);
        g.drawImage(image, 0, 0, null);
}
}

したがって、透明な「theimage」を不透明な「backimage」にペイントしています

4

2 に答える 2

2

はい、問題ありません。パレットやインデックス カラーは使用しないでください。

画像が本当に透明かどうか、色にアルファ成分があるかどうかを試してください。たとえば、次の場合test.html

<html>
<body>
<div style="background: url(backimage.png)"><img src="theimage.png"></div>
</body>
</html>
于 2013-09-11T14:48:56.693 に答える
1

私の経験から ImageIO.read は、間違った透明度/画像タイプを選択することにより、透明度なしで画像を読み込みます。したがって、私は回避策を使用します - ImageIcon を使用して ImageIcon を Image として読み込みます。この ImageIcon は、定義済みのイメージ タイプ BufferedImage.TYPE_INT_ARGB で空の BufferedImage に描画できます。また、イメージが後でフラッシュされない場合、ImageIcon はガベージ コレクタがイメージを収集することを禁止することを忘れないでください。

    ImageIcon imageIcon = new ImageIcon(imageAbsolutePath);
    Image tmpImage = imageIcon.getImage();

    BufferedImage image = new BufferedImage(imageIcon.getIconWidth(), imageIcon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
    image.getGraphics().drawImage(tmpImage, 0, 0, null);
    tmpImage.flush();

    return image;
于 2016-10-03T08:01:39.287 に答える