我现在有一个图片a.png,想通过java程序将白色的背景做成透明,然后保存成b.png。
网上找的代码可是不成功,背景还是白色的,不能透明。帮我看看什么问题,或者直接帮我实现也可以,谢谢import java.awt.image.ColorModel;
import java.awt.image.DirectColorModel;
import java.awt.image.RGBImageFilter;import com.sun.java_cup.internal.internal_error;class MyFilter extends RGBImageFilter {// 抽象类RGBImageFilter是ImageFilter的子类,              // 继承它实现图象ARGB的处理   int alpha = 0; 
 
 static double i=0; public MyFilter(int alpha) {// 构造器,用来接收需要过滤图象的尺寸,以及透明度      this.canFilterIndexColorModel = true;  
    this.alpha = alpha;   }   public int filterRGB(int x, int y, int rgb) {  
 i++;
    DirectColorModel dcm = (DirectColorModel) ColorModel.getRGBdefault();      // DirectColorModel类用来将ARGB值独立分解出来      int red = dcm.getRed(rgb);      int green = dcm.getGreen(rgb);      int blue = dcm.getBlue(rgb);      int alp=dcm.getAlpha(rgb);  
 if((red==255&&blue==255&&green==255)||alp==0){// 如果像素为白色,则让它透明  
     alpha = 0;   }else{       alpha=255;      }
    return alpha << 24 | red << 16 | green << 8 | blue;// 进行标准ARGB输出以实现图象过滤 } 
}mian函数代码如下:
try {            BufferedImage imageBiao = ImageIO.read(new FileInputStream("c:\\img\\a.png"));  
          Graphics2D g = imageBiao.createGraphics();            ImageFilter imgf = new MyFilter(255);  //白色          FilteredImageSource fis = new FilteredImageSource(imageBiao              .getSource(), imgf);          Image im = Toolkit.getDefaultToolkit().createImage(fis);            g.drawImage(null, 0, 0, imageBiao.getWidth(null), imageBiao.getHeight(null), null);            g.dispose();            ImageIO.write(imageBiao, "png", new File("c:\\img\\b.png"));          // 把以上原图和加上图标后的图像                } catch (Exception e) {            e.printStackTrace();           }  

解决方案 »

  1.   

    再描述一下,一个png格式图片a.png。如片内容就是白色背景+黑色文字。我想用程序把白色背景改为透明的背景,然后保存成b.png。思路是,读取a.png然后判断每个像素的RGB数值,如果都是255的话,那就把alpha设置为0(透明),然后把修改好的像素生成b.png。大概就是这样。我找的代码似乎都不行,所以,特来求教
      

  2.   

    那你保存回png的时候是如何观察它的结果的呢?是用绘图软件打开的?
      

  3.   

    呃,党草同学的发言估计要404了。
    VS工具里面有个transparent属性,只是不知道怎么封装的,楼主可以找一下这个虽然是C#工具,但是也可以借鉴
      

  4.   

    if((red==255&&blue==255&&green==255)||alp==0){// 如果像素为白色,则让它透明
    改成
    if(red>=240&&blue>=240&&green>=240&&alp!=0){// 如果像素为白色,则让它透明
    因为原始图像中的背景不一定是纯白色。估计一次处理不完,需要多次调整RGB的值。
      

  5.   

    to:powerlee2008
    我确定是 255 255 255 ,用你的方法不行。我觉得是我代码本身就有问题。所以大家不要看我的代码。
      

  6.   

    楼主,你设计alpha值后输出到png,你是如何检查其效果的?是用绘图软件看的?还是用Panel绘制?这样都不会看到透明效果的。
      

  7.   


    import java.awt.Color;
    import java.awt.image.*;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.Toolkit;
    import java.io.File;
    import java.io.FileInputStream;
    import javax.imageio.ImageIO;public class MyFilter extends RGBImageFilter {// 抽象类RGBImageFilter是ImageFilter的子类,    public static void main(String[] args) {
            try {
                BufferedImage imageBiao = ImageIO.read(new FileInputStream("e:\\1.png"));
                ImageFilter imgf = new MyFilter(Color.WHITE.getRGB()); //白色
                FilteredImageSource fis = new FilteredImageSource(imageBiao.getSource(), imgf);
                Image im = Toolkit.getDefaultToolkit().createImage(fis);
                im.flush();
                BufferedImage newImage = new BufferedImage(imageBiao.getWidth(), imageBiao.getHeight(), BufferedImage.TYPE_INT_ARGB);
                Graphics2D g = newImage.createGraphics();
                g.drawImage(im, 0, 0, null);
                g.dispose();
                newImage.flush();
                ImageIO.write(newImage, "png", new File("e:\\b.png"));
                // 把以上原图和加上图标后的图像
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        // 继承它实现图象ARGB的处理
        int rgb = 0;    public MyFilter(int rgb) {// 构造器,用来接收需要过滤图象的尺寸,以及透明度
            this.canFilterIndexColorModel = true;
            this.rgb = rgb;
        }
        DirectColorModel dcm = (DirectColorModel) ColorModel.getRGBdefault();    public int filterRGB(int x, int y, int rgb) {
            int alp = dcm.getAlpha(rgb);
            if (dcm.getRGB(rgb) == dcm.getRGB(this.rgb)/* || alp == 0*/) {// 如果像素为白色,则让它透明
                alp = 0;
    //            return Color.black.getRGB();//测试,透明的变成黑色
            }
            return alp << 24 | dcm.getRGB(rgb);// 进行标准ARGB输出以实现图象过滤
        }
        /*//这样不是再简单
        public int filterRGB(int x, int y, int rgb) {
        if ((this.rgb & 0xffffff) == (rgb & 0xffffff)) {
        return 0;
        }
        return rgb;
        }
         */
    }
      

  8.   

    是代码有个地方写错了
    Image im = Toolkit.getDefaultToolkit().createImage(fis);     g.drawImage(null, 0, 0, imageBiao.getWidth(null), imageBiao.getHeight(null), null);   改成:g.drawImage(im, 0, 0, imageBiao.getWidth(null), imageBiao.getHeight(null), null);   
    应该把 im 写进bufferedimage