java中载入图片的白色背景如何去掉?

private static Toolkit tk = Toolkit.getDefaultToolkit();方法载入的图,但是都有白色的背景,对象始终是矩形的,无法达到不规则图形。如何解决这个问题?
怎么让图片的白底变成透明呢?

你不理解图片是怎么表示的,普通的位图都是矩形区域,读到程序里就是一个每个像素点值的二维数组,像素的表示有多种情况,常见的是三基色红、绿、蓝 24 位整型数值表示,像 jpeg、bmp 等都是,是不带透明的。所谓透明那是因为有除了三原色值外的其他信息,例如 alpha 值,这样每个像素就占 32 位,它只是看起来是透明的而已,实际上还是一个矩形。

原来的图片要是不带透明的那你得把每个像素进行转换才能让它透明。swing 里处理图片比较麻烦,感觉还不如 swt 来的方便,你还不如预先把图片用软件处理成 png 的再用。

-------------------------------------------------------------
用图片处理软件(如 ps)把背景 p 掉。当然你也可以网上找个好用一点的软件把背景 p 掉。总之预先把背景 p 掉。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-09-09
package com.picture;  
  
import java.awt.Graphics2D;  
import java.awt.image.BufferedImage;  
import java.io.File;  
import java.io.IOException;  
import java.util.regex.Pattern;  
  
import javax.imageio.ImageIO;  
import javax.swing.ImageIcon;  
import javax.swing.JOptionPane;  
  
public class Picture {  
  
    public static void convert(String path) {  
        // TODO Auto-generated constructor stub  
        try {  
            BufferedImage image = ImageIO.read(new File(path));  
            ImageIcon imageIcon = new ImageIcon(image);  
            BufferedImage bufferedImage = new BufferedImage(  
                    imageIcon.getIconWidth(), imageIcon.getIconHeight(),  
                    BufferedImage.TYPE_4BYTE_ABGR);  
            Graphics2D g2D = (Graphics2D) bufferedImage.getGraphics();  
            g2D.drawImage(imageIcon.getImage(), 0, 0,  
                    imageIcon.getImageObserver());  
            int alpha = 0;  
            for (int j1 = bufferedImage.getMinY(); j1 < bufferedImage  
                    .getHeight(); j1++) {  
                for (int j2 = bufferedImage.getMinX(); j2 < bufferedImage  
                        .getWidth(); j2++) {  
                    int rgb = bufferedImage.getRGB(j2, j1);  
                    if (colorInRange(rgb))  
                        alpha = 0;  
                    else  
                        alpha = 255;  
                    rgb = (alpha << 24) | (rgb & 0x00ffffff);  
                    bufferedImage.setRGB(j2, j1, rgb);  
                }  
            }  
            g2D.drawImage(bufferedImage, 0, 0, imageIcon.getImageObserver());  
            // 生成图片为PNG  
            String outFile = path.substring(0, path.lastIndexOf("."));  
            ImageIO.write(bufferedImage, "png", new File(outFile + ".png"));  
        } catch (IOException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
    }  
  
    public static boolean colorInRange(int color) {  
        int red = (color & 0xff0000) >> 16;  
        int green = (color & 0x00ff00) >> 8;  
        int blue = (color & 0x0000ff);  
        if (red >= color_range && green >= color_range && blue >= color_range)  
            return true;  
        return false;  
    }  
  
    public static int color_range = 210;  
    public static Pattern pattern = Pattern.compile("[0-9]*");  
  
    public static boolean isNo(String str) {  
        return pattern.matcher(str).matches();  
    }  
  
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
        // TODO Auto-generated method stub  
        String path = JOptionPane.showInputDialog(null, "请输入图片目录");  
        if (path == null || !new File(path).isDirectory()) {  
            JOptionPane.showMessageDialog(null, "输入目录有误!");  
            return;  
        }  
        String color = JOptionPane.showInputDialog(null, "请输入色差范围0~255(建议10~50)");  
        if (isNo(color)) {  
            color_range = 255 - Integer.parseInt(color);  
            File file = new File(path);  
            String[] files = file.list();  
            for (int i = 0; i < files.length; i++) {  
                String ext = files[i].substring(files[i].lastIndexOf(".") + 1);  
                if (ext.equals("jpg")) {  
                    convert(path + "//" + files[i]);  
                }  
            }  
            JOptionPane.showMessageDialog(null, "转换完成!");  
        } else {  
            JOptionPane.showMessageDialog(null, "输入的数字有误!");  
        }  
    }  
  
}

以上内容可以强制删除白色背景。

第2个回答  2015-08-22

    如果目的是在前台显示透明图片的话,建议用Png格式的图片,可以做成透明图片;

    java中有BufferedImage类,用BufferedImage读取图片,有getRGB(x,y)方法,获取坐标的像素值,逐个扫描所有点(根据 getWidth()和getHeight())判断是否为白色,setRGB(x, y, c & 0x00ffffff)设置改点为透明。只不过效率可能很低。

第3个回答  2010-06-25
你先确定 你的图是否有白底!!!! 不规则图形不是说程序怎样?
你的图只要是透明背景的话 那载入进来绝对是可以正常显示的 不会说什么始终是个矩形! 你目前看到的矩形 可能是因为图有个白色的底!

用ps啊将你的图的背景设置为透明的!!!
第4个回答  2015-08-25

图片的白色背景一般是需要处理图片的,相关步骤为:

    将图片处理为png图片

    将png图片设置为控件的背景图片

相似回答