我现在有一个图片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(); }
网上找的代码可是不成功,背景还是白色的,不能透明。帮我看看什么问题,或者直接帮我实现也可以,谢谢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(); }
VS工具里面有个transparent属性,只是不知道怎么封装的,楼主可以找一下这个虽然是C#工具,但是也可以借鉴
改成
if(red>=240&&blue>=240&&green>=240&&alp!=0){// 如果像素为白色,则让它透明
因为原始图像中的背景不一定是纯白色。估计一次处理不完,需要多次调整RGB的值。
我确定是 255 255 255 ,用你的方法不行。我觉得是我代码本身就有问题。所以大家不要看我的代码。
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;
}
*/
}
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