处理PNG图片将白色背景透明的问题

zjzty888 2011-05-16 05:05:18
我现在有一个图片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();

}
...全文
2769 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
mahaigss 2011-08-25
  • 打赏
  • 举报
回复
是代码有个地方写错了
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
bawgiitx 2011-05-18
  • 打赏
  • 举报
回复

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;
}
*/
}
我是风 2011-05-17
  • 打赏
  • 举报
回复
if((red==255&&blue==255&&green==255)||alp==0){// 如果像素为白色,则让它透明
改成
if(red>=240&&blue>=240&&green>=240&&alp!=0){// 如果像素为白色,则让它透明
因为原始图像中的背景不一定是纯白色。估计一次处理不完,需要多次调整RGB的值。
一邺飘零 2011-05-17
  • 打赏
  • 举报
回复
呃,党草同学的发言估计要404了。
VS工具里面有个transparent属性,只是不知道怎么封装的,楼主可以找一下这个。。。虽然是C#工具,但是也可以借鉴
wenbodong 2011-05-17
  • 打赏
  • 举报
回复
楼主,你设计alpha值后输出到png,你是如何检查其效果的?是用绘图软件看的?还是用Panel绘制?这样都不会看到透明效果的。
zjzty888 2011-05-17
  • 打赏
  • 举报
回复
to:powerlee2008
我确定是 255 255 255 ,用你的方法不行。我觉得是我代码本身就有问题。所以大家不要看我的代码。
wenbodong 2011-05-16
  • 打赏
  • 举报
回复
那你保存回png的时候是如何观察它的结果的呢?是用绘图软件打开的?
zjzty888 2011-05-16
  • 打赏
  • 举报
回复
再描述一下,一个png格式图片a.png。如片内容就是白色背景+黑色文字。我想用程序把白色背景改为透明的背景,然后保存成b.png。

思路是,读取a.png然后判断每个像素的RGB数值,如果都是255的话,那就把alpha设置为0(透明),然后把修改好的像素生成b.png。

大概就是这样。我找的代码似乎都不行,所以,特来求教
wenbodong 2011-05-16
  • 打赏
  • 举报
回复
楼主,能说清楚点不?什么叫把白色的背景做成透明?
你的意思是不是说,白色为背景,在其上显示图片,但是图片做成透明的,这样即可以看到上面的图片,又能看到下面的背景?

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧