您的位置:首页 > 编程语言 > Java开发

JAVA图片透明处理

2011-05-10 10:32 411 查看
public static void main(String[] args) {
try {
BufferedImage image = ImageIO
.read(new FileInputStream("f://1.jpg"));
// 读取图标
BufferedImage imageBiao = ImageIO.read(new FileInputStream(
"f://3.png"));
Graphics2D g = image.createGraphics();
// g.setColor(Color.YELLOW);
// g.setFont(new Font("华文中宋", Font.LAYOUT_LEFT_TO_RIGHT, 48));
// g.drawString("图像合成示例",100, image.getHeight() - 400);
// 写入图标
ImageFilter imgf = new MyFilter(255);
FilteredImageSource fis = new FilteredImageSource(imageBiao
.getSource(), imgf);
Image im = Toolkit.getDefaultToolkit().createImage(fis);
g.drawImage(im, 0, 0, imageBiao.getWidth(null), imageBiao
.getHeight(null), null);
g.dispose();
FileOutputStream out = new FileOutputStream("f://图标文字合成3.gif");
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.close();
// 把以上原图和加上图标后的图像
} catch (Exception e) {
e.printStackTrace();
}
}
}
class MyFilter extends RGBImageFilter {// 抽象类RGBImageFilter是ImageFilter的子类,
// 继承它实现图象ARGB的处理
int alpha = 0;
public MyFilter(int alpha) {// 构造器,用来接收需要过滤图象的尺寸,以及透明度
this.canFilterIndexColorModel = true;
// TransparentImageFilter类继承自RGBImageFilter,它的构造函数要求传入原始图象的宽度和高度。
// 该类实现了filterRGB抽象函数
// ,缺省的方式下,该函数将x,y所标识的象素的ARGB值传入,程序员按照一定的程序逻辑处理后返回该象素新的ARGB值
this.alpha = alpha;
}
public int filterRGB(int x, int y, int rgb) {
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){// 如果像素为白色,则让它透明
alpha = 0;
}else{
alpha=255;
}
//if (alp==0) {//png和gif格式图片透明部分仍然透明
// alpha = 0;
// }else{
//   alpha = 255;
//}
return alpha << 24 | red << 16 | green << 8 | blue;// 进行标准ARGB输出以实现图象过滤
}
如果这样的话是可以是可以达到效果的,但是白色遇其他颜色交接的地方老出现锯齿,是不是失真啊
后来找了些png和gif的图片将中间白色的扣掉了,以为直接合成就可以了,但是不行,还要加上对alpha的判断
//if (alp==0) {//png和gif格式图片透明部分仍然透明
// alpha = 0;
// }else{
//   alpha = 255;
//}
不过效果还是不好,但比前面将白色透明的效果过好多了,所以还是将图片先处理一下再调用程序
这些都是将图片部分透明的,如果想全部一起透明的话,建议使用 AlphaComposite 类的getInstance (int rule, float alpha)方法设置alpha的值

原文出处:http://hi.baidu.com/berry_0712/blog/item/6a28190f7ce02c2d6059f3e2.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: