gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:13:42 25 4
gpt4 key购买 nike

我正在使用 javax.swing 制作我的国际象棋游戏。我正在使用 gridLayout(8,8) 填充 JButtons,背景颜色在棋盘上像往常一样设置为棕色和浅棕色。现在,我想将 ImageIcon(king、rock 等)放在我从 google images 获得的按钮上,并在 paint.net 中编辑它们。

white king on gray background

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

white king on light gray background

然后根据哪个 JButton block 登陆(但我宁愿不这样做)来切换 ImageIcon,或者使该图像上的背景颜色透明,但我不知道该怎么做(例如,是否有一些颜色可以自动变透明)

谢谢你的帮助。

最佳答案

你应该看看RGBA color model .

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

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

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

Color(int r, int g, int b, int a) Creates an sRGB color with the specified red, green, blue, and alpha values in the range (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;
}
}

关于java - 如何在 JButton ImageIcon 中使颜色不可见(透明),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39836634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com