Java中如何用swing制作半透明图像?

问题描述 投票:0回答:1

我正在使用Java的swing制作一个游戏。 游戏中有一个部分需要将某个图像以50%的透明度暴露在屏幕上,但我不知道如何使该图像透明。 如果你知道请告诉我。

我在互联网上搜索了此信息,但我找到的只是关于使窗口本身透明或删除图像后面的背景。 我也想过用另一个程序把原图变成透明的,插入到一个单独的源文件中,但不仅不完美,而且感觉和游戏中的背景画面不一样,所以我放弃了。

我不熟悉英语,所以我使用了翻译器。即使语法很差,我也希望您能理解。

  • 我不想删除特定图像的背景,我希望图像本身是透明的。

示例图片: desired outcome

但是,发现与我的问题类似的其他问题并不是关于此,而是询问如何删除图像的背景并获得答案。这不符合我的目的。

java image swing transparency
1个回答
0
投票
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class TranslucentImage extends JLabel {

   void iniciar() {
      JFrame fra = new JFrame( "Translucent" );
      fra.setDefaultCloseOperation( javax.swing.WindowConstants.EXIT_ON_CLOSE );
      fra.setBounds( 100, 100, 400, 400 );
      fra.requestFocusInWindow();
      fra.setFocusable( true );
      fra.setLayout( null );
      JPanel a = new JPanel(),
              b = new JPanel();
      a.setBounds( 0, 0, 200, 400 );
      b.setBounds( 200, 0, 200, 400 );
      setBounds( 100, 100, 200, 200 );
      a.setBackground( Color.red );
      b.setBackground( Color.blue );
      fra.add( this );
      fra.add( a );
      fra.add( b );
      fra.setVisible( true );
   }

   @Override
   public void paintComponent( Graphics g ) {
      super.paintComponent( g );
      Graphics2D gr = ( Graphics2D ) g;
      AlphaComposite ac = AlphaComposite
              .getInstance( AlphaComposite.SRC_OVER, 0.5f );
      gr.setComposite( ac );
      gr.setColor( Color.yellow );
      gr.fillRect( 0, 0, 200, 200 );
   }

   public static void main( String[] args ) {
      TranslucentImage aa = new TranslucentImage();
      aa.iniciar();
   }
}

为了使 JLabel 显示透明绘图,我们覆盖 paintComponent() 方法,并在绘制矩形之前,添加以下行:

AlphaComposite transparency = AlphaComposite
      .getInstance( AlphaComposite.SRC_OVER, 0.5f );

将透明度设置为 0.5(通过 float 0.5f)。 然后我们将 Graphics2D 对象设置为该值:

gra.setComposite( transparency );

这将使矩形按照我们的要求绘制。

注意:在此示例中,我使用了两个 JPanel,并排放置,因此您可以看到由于透明度而产生的差异,它们添加到 JFrame 的顺序很重要(add( )) 因为它决定了谁绘制在谁之上(您也可以使用 setComponentZOrder)。
您可以达到相同的方案,只需在 JLabel 中绘制,首先绘制实心矩形,然后绘制透明矩形,如下所示:

public class TranslucentImage extends JLabel {

   void iniciar() {
      JFrame fra = new JFrame( "Translucent" );
      fra.setDefaultCloseOperation( javax.swing.WindowConstants.EXIT_ON_CLOSE );
      fra.setBounds( 100, 100, 400, 400 );
      fra.requestFocusInWindow();
      fra.setFocusable( true );
      fra.setLayout( null );
      setBounds( 0, 0, 400, 400 );
      fra.add( this );          
      fra.setVisible( true );
   }

   @Override
   public void paintComponent( Graphics g ) {
      super.paintComponent( g );
      Graphics2D gr = ( Graphics2D ) g; 
       gr.setColor( Color.red );
       gr.fillRect( 0, 0, 200, 400 );
       gr.setColor( Color.blue );
       gr.fillRect( 200, 0, 200, 400 );          
      AlphaComposite ac = AlphaComposite
              .getInstance( AlphaComposite.SRC_OVER, 0.5f );
      gr.setComposite( ac );
      gr.setColor( Color.yellow );
      gr.fillRect( 100, 100, 200, 200 );
   }

   public static void main( String[] args ) {
      TranslucentImage aa = new TranslucentImage();
      aa.iniciar();
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.