如何在JButton ImageIcon

时间:2016-10-03 16:54:14

标签: java swing jbutton

我正在用javax.swing制作国际象棋游戏。 我正在使用填充了JButton的gridLayout(8,8),背景色 在棋盘上像往常一样设置为棕色和浅棕色。 现在我想将ImageIcon(国王,摇滚,等等)放在我从谷歌图片获得的按钮上,并在paint.net中编辑它们。

white king on gray background

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

white king on light gray background

只是swich ImageIcon取决于哪个JButton片落在哪个(但我宁愿没有), 或者使该图像上的背景颜色透明,但我不知道该怎么做(例如,有一些颜色可以自动透明制作)

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

你应该看看RGBA color model

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

这意味着你可以拥有一个透明的"通过将颜色的Alpha值设置为0来着色。

java.awt.Color类提供了一些构造函数,您可以在其中指定Color的alpha值,例如:

  

Color(int r,int g,int b,int a)使用。创建sRGB颜色   指定范围内的红色,绿色,蓝色和alpha值(0 - 255)。

如果您找不到能够为您提供此选项的程序,您可以自己透明图像的背景颜色。

例如,我编写的这段代码试图从灰色背景上的白王移除背景颜色"图片。 如果您尝试编译并运行,您应该得到以下结果:

Test screenshot

正如您所看到的,并非所有背景都已从图像中移除,这是因为背景是由不同颜色制作的。

但是此示例显示您可以操纵图像像素以获得透明度。

我认为最好的选择是在线搜索一些已经具有透明背景的国际象棋图像。

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

Black Rook

White Queen

示例代码:

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;
    }
}