Java 如何在JButton ImageIcon中使颜色不可见(透明)

Java 如何在JButton ImageIcon中使颜色不可见(透明),java,swing,jbutton,Java,Swing,Jbutton,我正在用javax.swing制作我的国际象棋游戏。 我使用的是gridLayout(8,8),里面填充了JButtons和背景色 在棋盘上设置为棕色和浅棕色。 现在我想把ImageIcon(king、rock等)放在我从google图片中获得的按钮上,然后在paint.net中编辑它们 但是大部分的按钮都可以从灰色按钮移动到浅灰色按钮。 所以我可以在浅灰色的背景上制作所有的作品 只需根据JButton部件的登录位置来切换ImageIcon(但我不希望如此), 或者使图像上的背景色透明,但我

我正在用javax.swing制作我的国际象棋游戏。 我使用的是gridLayout(8,8),里面填充了JButtons和背景色 在棋盘上设置为棕色和浅棕色。 现在我想把ImageIcon(king、rock等)放在我从google图片中获得的按钮上,然后在paint.net中编辑它们

但是大部分的按钮都可以从灰色按钮移动到浅灰色按钮。 所以我可以在浅灰色的背景上制作所有的作品

只需根据JButton部件的登录位置来切换ImageIcon(但我不希望如此), 或者使图像上的背景色透明,但我不知道如何做到这一点(例如,是否有某种颜色可以自动使其透明)

谢谢你的帮助。

你应该看看

在此模型中,A代表alpha通道,通常用作不透明度通道

这意味着您可以通过将颜色的alpha值设置为0来获得“透明”颜色

该类提供了一些构造函数,您可以在其中指定颜色的alpha值,例如:

颜色(intr、intg、intb、inta)创建一个具有 指定范围(0-255)内的红色、绿色、蓝色和alpha值

如果找不到提供此选项的程序,您可以自己将图像的背景色设置为透明

例如,我编写的这段代码试图从“灰色背景上的白色国王”图像中删除背景色。 如果您尝试编译并运行,则应得到以下结果:

因为你看不到图像中的所有背景都被移除了,这是因为背景是由不同的颜色构成的

但这个例子向您展示了,您可以操纵图像像素以获得透明度

我认为最好的选择是在网上搜索一些已经有透明背景的象棋图像

例如,我可以在这里发布一些链接(我不知道是否存在版权问题,请注意),如果您检查URL,您可以轻松获得所有图像:

示例代码:

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
public class TransparentTest
{
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                try {
                    BufferedImage image = ImageIO.read(new File("KING.jpg"));
                    BufferedImage transparentImage = removeColors(image,new Color(245,222,180));
                    createAndShowGUI(image,transparentImage);
                }
                catch(IOException ex) {
                    JOptionPane.showMessageDialog(null,"Please check your file image path","Error",JOptionPane.ERROR_MESSAGE);
                }
            }
        });
    }
    public static void createAndShowGUI(BufferedImage image,BufferedImage transparentImage) {
        JPanel pane = new JPanel(new FlowLayout(FlowLayout.CENTER,40,10));
        pane.setBackground(Color.BLUE);
        pane.add(new JLabel(new ImageIcon(image)));
        pane.add(new JLabel(new ImageIcon(transparentImage)));
        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(pane);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    public static BufferedImage removeColors(BufferedImage image,Color... colorsBlackList) throws IOException {
        int height = image.getHeight(), width=image.getWidth();
        BufferedImage transparentImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB); 
        for(int y=0;y<height;y++) {
            for(int x=0;x<width;x++) {
                int pixel = image.getRGB(x,y);
                int red = (pixel>>16) &0xff;
                int green = (pixel>>8) &0xff;
                int blue = (pixel>>0) &0xff;
                int alpha = 255;
                // Settings opacity to 0 ("transparent color") if the pixel color is equal to a color taken from the "blacklist"
                for(Color color : colorsBlackList) {
                    if(color.getRGB() == pixel) alpha = 0;
                }
                transparentImage.setRGB(x,y,(alpha&0x0ff)<<24 | red<<16 | green<<8 | blue);
            }
        }
        return transparentImage;
    }
}
导入java.awt.Color;
导入java.awt.FlowLayout;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入javax.imageio.imageio;
导入javax.swing.JFrame;
导入javax.swing.ImageIcon;
导入javax.swing.JLabel;
导入javax.swing.JOptionPane;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
导入javax.swing.UIManager;
公开课透明片
{
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
试一试{
buffereImage image=ImageIO.read(新文件(“KING.jpg”);
BuffereImage transparentImage=移除颜色(图像,新颜色(245222180));
创建并显示GUI(图像、透明图像);
}
捕获(IOEX异常){
showMessageDialog(null,“请检查您的文件映像路径”,“错误”,JOptionPane.Error\u消息);
}
}
});
}
公共静态void createAndShowGUI(BuffereImage图像、BuffereImage透明图像){
JPanel窗格=新的JPanel(新的FlowLayout(FlowLayout.CENTER,40,10));
窗格。背景(颜色。蓝色);
添加(新JLabel(新图像图标(图像));
添加(新JLabel(新图像图标(透明图像));
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(窗格);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
公共静态BuffereImage RemoveColor(BuffereImage image、Color…colorsBlackList)引发IOException{
int height=image.getHeight(),width=image.getWidth();
BuffereImage transparentImage=新的BuffereImage(宽度、高度、BuffereImage.TYPE_INT_ARGB);
对于(int y=0;y16)&0xff;
绿色整数=(像素>>8)&0xff;
蓝色整数=(像素>>0)&0xff;
int alpha=255;
//如果像素颜色等于“黑名单”中的颜色,则将不透明度设置为0(“透明颜色”)
for(颜色:ColorsBlaklist){
如果(color.getRGB()=像素)alpha=0;
}

transparentImage.setRGB(x,y,(alpha&0x0ff)为什么不在paint.net中使图像的背景透明?不幸的是,如果我在paint.net中从片段图像中移除背景(因此只保留片段本身,其余仅为黑白方块)然后在按钮上加载swing作为图像图标,它将具有白色背景,而不是transparent@eldo概述了最佳方法。在专用的绘画应用程序中将纯色背景更改为透明。“是否有某种颜色可以自动使透明化?”否。另请参见获取棋子图标的不同方法(在运行时生成)@Fredegar你确定你有透明背景吗?那不是一个白色背景层还是什么的吗?@eldo是的,我在那张照片上有透明背景,但我把它们保存为.jpg。然后我红了Ansharja的答案,看到了他/她的黑车和白皇后的例子,意识到他/她的照片是.png格式的,所以我改变了pics to.png,效果很好。不再有白色背景。谢谢大家的努力,我的问题已经解决了。谢谢你们,这帮了我很大的忙