【问题标题】:How to keep transparent background in a png image如何在png图像中保持透明背景
【发布时间】:2016-08-03 04:35:44
【问题描述】:

我从事一个项目已经有一段时间了。我正在构建一个扑克牌套牌课程,最终将用于制作我自己的纸牌游戏。我决定使用图像作为卡片的索引,而不是让 java 绘制它们。我在 Illustrator 中绘制了自己的西装,并将它们保存为具有透明背景的 PNG。当我朗姆酒时,我可以让图像显示在我的程序中,但是当我将图像添加到我的 JFrame 时,背景颜色消失了,这让我相信由于某种原因没有保持透明度。我尝试了两种将图像添加到我的 GUI 的不同方法,并且两次都得到了相同的结果。我尝试过的一种方法是这里建议的方法How to add an image to a JPanel? 我尝试过的另一种方法是这里建议的How can I display a BufferedImage in a JFrame? 这两种方法都不是我想要的。我希望我的西装显示在屏幕上,并且仍然能够看到背景。

这是我想要正常工作的当前代码,我确实意识到它编译和运行都很好,但我希望仍然能够看到背景。

import java.io.File;
import java.io.IOException;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import javax.imageio.ImageIO;



public class ImageReadTest extends JPanel{
   public static void main(String[] args){
      //Just a simple test on reading pictures into a java file and drawing them
      //onto a JFrame
      System.out.println("Java Image Read Test");
      JFrame frame = new JFrame("Image Reader");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setBackground(Color.green);

      frame.add(new ImageReadTest());
      frame.pack();
      frame.setSize(250,250);
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   private BufferedImage image;
   public ImageReadTest(){
      try{
         image = ImageIO.read(new File("Club.png"));
      } catch(IOException e){
         System.out.println("Error");
      }
   }
   @Override
   protected void paintComponent(Graphics g){
      super.paintComponent(g);
      g.drawImage(image, 90, 90, null);
   }
}//end class ImageReadTest

这是我测试代码的图片,感谢您花时间阅读和帮助!

【问题讨论】:

  • 我不是图像专家,但我怀疑您必须将图像类型设置为 BufferedImage.TYPE_INT_ARGB 以便看到 alpha 通道。您可能无法使用ImageIO.read(File) 提供的默认值。如果这被证明是问题,那么问题是stackoverflow.com/q/4694153/18157 的重复,我通过简单的谷歌搜索找到了“java jgrame png 透明度”
  • @Jim Garrison 他在您提供的问题中所做的是创建一个 JLabel,并将图像作为存储在标签中的图像图标。我想避免使用这种方法。我在发布此问题之前尝试过它,它显示图像但没有透明度。在您提供的问题中,OP 说透明部分显示为黑色,而我的情况并非如此。此外,我还没有使用过 BufferedImage.TYPE_INT_ARGB 并且提供的问题并没有提供太多关于如何使用该枚举的示例,假设它是一个枚举。

标签: java image graphics


【解决方案1】:

问题不在于获取图像。该程序为您提供正确的结果,即图像的背景是透明的。但是您的ImageReadTest JPanel 的颜色和您的jFrameContentPane 的颜色是相同的。因此,您无法检测到差异。

只需替换以下行

frame.setBackground(Color.green);

有了这个

frame.getContentPane.setBackground(Color.green);

这里要理解的是,在您的 jPanel 和 jFrame 之间还有一层,即 ContentPane。

编辑: 因为您想让自己的窗格透明,您必须将其不透明度设置为 false。为此,请在构造函数中添加以下行。

setOpaque(false);

【讨论】:

  • 那行不通。我尝试添加该行代替 frame.setBackground(Color.green);正如你所建议的,但仍然是灰色背景。在将图像添加到屏幕后,我也尝试放置它,但没有运气。但是,您的回答确实让我更好地理解了内容窗格是什么。也许我遗漏了其他可能很明显的东西?
  • setOpaque(false);是需要的代码。感谢您的帮助!
  • 你的意思是frame.getContentPane.setBackground(Color.green) 不是必需的吗? @Randy_E
  • 这是一个很好的观点,我仍然需要那条线,所以它是解决我的问题的两者的组合。
猜你喜欢
  • 2011-08-21
  • 2014-10-05
  • 1970-01-01
  • 2010-12-14
  • 2012-02-26
  • 2011-03-04
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
相关资源
最近更新 更多