使用没有透明度的图像,“背景”将是图像 BG 中的任何颜色。
图标是 jpg 文件(没有透明度),但只填充了整个按钮的一部分。
有关如何获取与图标精确大小的按钮的提示,请参阅此问题。下图由 4 个按钮和 5 个标签组成,其中的图标是从单个图像中剪下的。
..图标下方的文本仍将显示按钮背景颜色..
啊对。文字亦然。
在这种情况下,最好的策略是从现有图像创建一个具有透明 BG的图像,然后在它提供的任何按钮(具有任何 GB 颜色)中使用它。
为此,请获取图像的 PNG(PNG 不像 JPG 那样有损),并使用专用的图像编辑器将其保存为透明的 BG。但是如果我们被迫在运行时这样做,考虑使用这样的东西:
这张图片实际上展示了 JPG 的有损特性。我们必须与基本 BG 颜色越来越“远离”,以尝试拾取原始图标之外的所有像素。即使在对相似颜色的最宽松的解释中,我仍然看到一些我希望删除的斑点。
import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.imageio.ImageIO;
import java.net.URL;
class ImageBackgroundCleaner {
public static BufferedImage clearImageBackground(BufferedImage solidBG, int distance) {
int w = solidBG.getWidth();
int h = solidBG.getHeight();
BufferedImage transparentBG = new BufferedImage(
w,
h,
BufferedImage.TYPE_INT_ARGB);
int c = solidBG.getRGB(0, 0);
for (int xx=0; xx<w; xx++) {
for(int yy=0; yy<h; yy++) {
int s = solidBG.getRGB(xx, yy);
if (getColorDistance(s,c)>=distance) {
transparentBG.setRGB(xx, yy, s);
}
}
}
return transparentBG;
}
public static int getColorDistance(int color1, int color2) {
Color c1 = new Color(color1);
Color c2 = new Color(color2);
int r1 = c1.getRed();
int g1 = c1.getGreen();
int b1 = c1.getBlue();
int r2 = c2.getRed();
int g2 = c2.getGreen();
int b2 = c2.getBlue();
return Math.abs(r1-r2) + Math.abs(g1-g2) + Math.abs(b1-b2);
}
public static void main(String[] args) throws Exception {
URL url = new URL("http://i.stack.imgur.com/Yzfbk.png");
BufferedImage bi = ImageIO.read(url);
final BufferedImage img = bi.getSubimage(39, 21, 40, 40);
Runnable r = new Runnable() {
@Override
public void run() {
JPanel gui = new JPanel(new GridLayout(3,0,5,5));
gui.setBackground(Color.RED);
JLabel original = new JLabel(new ImageIcon(img));
gui.add(original);
int start = 12;
int inc = 3;
for (int ii=start; ii<start+(8*inc); ii+=inc) {
gui.add(new JLabel(new ImageIcon(clearImageBackground(img, ii))));
}
JOptionPane.showMessageDialog(null, gui);
}
};
// Swing GUIs should be created and updated on the EDT
// http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
SwingUtilities.invokeLater(r);
}
}