我支持开源,因此我会把自己未涉及公司利益的代码和思想贴出来。以前要求回复邮箱,因为我想看看有没有人要这些东西。
以前家里不能上网,只能去女朋友那蹭网,没时间维护blog,现在家里装了adsl,希望能多多的维护这个blog。
由于没什么时间,做的东西也没有去进行更多的考虑,不好的地方,希望大家指出,但千万不要拍我。
后面给出邮箱的哥们,不好意思,就不发了,自己来这看吧。其实很简单(下面的代码并没有经过仔细斟酌,效率性能方面大家可以指出问题来修改)。
以前家里不能上网,只能去女朋友那蹭网,没时间维护blog,现在家里装了adsl,希望能多多的维护这个blog。
由于没什么时间,做的东西也没有去进行更多的考虑,不好的地方,希望大家指出,但千万不要拍我。
后面给出邮箱的哥们,不好意思,就不发了,自己来这看吧。其实很简单(下面的代码并没有经过仔细斟酌,效率性能方面大家可以指出问题来修改)。
/**
* JAVA支持图像中的透明通道,所以只要设置图像的透明通道,就可以实现图像的透明效果。
* 使用BufferedImage类实现图像的透明和灰度效果。
* BufferedImage对象的创建:直接通过jdk1.5中增加的javax.imageio.ImageIO.read()方法
* 读取图像文件即可获得。
* 实现起来很简单,但其实不简单,只是因为SUN帮我们做了很多事情。
* 目前版本1.0.0,没有经过多少测试,欢迎报告bug,欢迎改进,欢迎交流。
*
* <b>所有图像格式没有考虑8位以下图像格式<b>
* <b>部分方法配有一个后缀为Ex的版本,并不是功能增强,只是指定透明色值的参数
* 类型有了变化<b>
* Email: chenhao518530@163.com
* copyright 2006 BBE&BFE(TM)
*
* @author BBE
* @version 1.0.0
* @Date 2006.12.26
* @see
*
*/
package bbe.transparence;
import javax.imageio.*;
import java.awt.color.*;
import java.awt.*;
import java.awt.image.*;
public abstract class Transparence
{
/*
* 构建imageSrc的拷贝,象素颜色为mask的显示为透明
*
* @param imageSrc 原始图像
* @param mask mask为Object的实例,因为如果imageSrc为灰度图,或者为索引颜色图,则mask应为指定
* 灰度或索引的数值。如果imageSrc是其他模式的图像,则使用一个Color对象指定颜色值
* @return 返回imageSrc的拷贝,象素颜色为mask的显示为透明
*/
public static BufferedImage createImageByMaskColor(BufferedImage imageSrc, Object mask) {
int x = imageSrc.getWidth(null);
int y = imageSrc.getHeight(null);
Raster rasterSrc = imageSrc.getRaster();
BufferedImage imageDes = new BufferedImage(x, y, BufferedImage.TYPE_4BYTE_ABGR);
WritableRaster rasterDes = imageDes.getRaster();
int[] src = null;
int[] des = new int[4];
int type = imageSrc.getType();
if (type == BufferedImage.TYPE_BYTE_GRAY) {
int cmask = (Integer)mask;
while (--x >= 0)
for (int j = 0; j < y; ++j) {
src = rasterSrc.getPixel(x, j, (int[])null);
if (src[0] == cmask)
des[3] = 0;
else {
des[0] = src[0];
des[1] = src[0];
des[2] = src[0];
des[3] = 255;
}
rasterDes.setPixel(x, j, des);
}
} else if (type == BufferedImage.TYPE_BYTE_INDEXED) {
int cmask = (Integer)mask;
ColorModel cm = imageSrc.getColorModel();
Object data = null;
while (--x >= 0)
for (int j = 0; j < y; ++j) {
src = rasterSrc.getPixel(x, j, (int[])null);
if (src[0] == cmask) {//透明
des[3] = 0;//
} else {
data = rasterSrc.getDataElements(x, j, null);
int argb = cm.getRGB(data);
Color color = new Color(argb, true);
des[0] = color.getRed();
des[1] = color.getGreen();
des[2] = color.getBlue();
des[3] = 255;
}
rasterDes.setPixel(x, j, des);
}
} else {
ColorModel cm = imageSrc.getColorModel();
Color cmask = (Color)mask;
Object data = null;
int maskR, maskG, maskB;
maskR = cmask.getRed();
maskG = cmask.getGreen();
maskB = cmask.getBlue();
while (--x >= 0)
for (int j = 0; j < y; ++j) {
data = rasterSrc.getDataElements(x, j, null);
int rgb = cm.getRGB(data);
int sr, sg, sb;
sr = (rgb & 0xFF0000)>>16;
sg = (rgb & 0xFF00)>>8;
sb = rgb & 0xFF;
if (sr != maskR || sg != maskG || sb != maskB) {
des[0] = sr;
des[1] = sg;
des[2] = sb;
des[3] = 255;
}
else
des[3] = 0;
rasterDes.setPixel(x, j, des);
}
}
return imageDes;
}
/*
* 构建imageSrc的拷贝,象素颜色为mask的显示为透明
*
* @param imageSrc 原始图像
* @param mask 无论原始图像的色彩模式为何种模式,mask统一传入一个
* Color类型的对象指定希望显示为透明的色彩值
* @return 返回imageSrc的拷贝,象素颜色为mask的显示为透明
*/
public static BufferedImage createImageByMaskColorEx(BufferedImage imageSrc, Color mask) {
int x, y;
x = imageSrc.getWidth(null);
y = imageSrc.getHeight(null);
Raster rasterSrc = imageSrc.getRaster();
BufferedImage imageDes = new BufferedImage(x, y, BufferedImage.TYPE_4BYTE_ABGR);
WritableRaster rasterDes = imageDes.getRaster();
int[] src = null;
int[] des = new int[4];
ColorModel cm = imageSrc.getColorModel();
Color cmask = (Color)mask;
Object data = null;
int maskR, maskG, maskB;
maskR = cmask.getRed();
maskG = cmask.getGreen();
maskB = cmask.getBlue();
while (--x >= 0)
for (int j = 0; j < y; ++j) {
data = rasterSrc.getDataElements(x, j, null);
int rgb = cm.getRGB(data);
int sr, sg, sb;
sr = (rgb & 0xFF0000)>>16;
sg = (rgb & 0xFF00)>>8;
sb = rgb & 0xFF;
if (sr == maskR && sg == maskG && sb == maskB)
des[3] = 0;
else {
des[0] = sr;
des[1] = sg;
des[2] = sb;
des[3] = 255;
}
rasterDes.setPixel(x, j, des);
}
return
* JAVA支持图像中的透明通道,所以只要设置图像的透明通道,就可以实现图像的透明效果。
* 使用BufferedImage类实现图像的透明和灰度效果。
* BufferedImage对象的创建:直接通过jdk1.5中增加的javax.imageio.ImageIO.read()方法
* 读取图像文件即可获得。
* 实现起来很简单,但其实不简单,只是因为SUN帮我们做了很多事情。
* 目前版本1.0.0,没有经过多少测试,欢迎报告bug,欢迎改进,欢迎交流。
*
* <b>所有图像格式没有考虑8位以下图像格式<b>
* <b>部分方法配有一个后缀为Ex的版本,并不是功能增强,只是指定透明色值的参数
* 类型有了变化<b>
* Email: chenhao518530@163.com
* copyright 2006 BBE&BFE(TM)
*
* @author BBE
* @version 1.0.0
* @Date 2006.12.26
* @see
*
*/
package bbe.transparence;
import javax.imageio.*;
import java.awt.color.*;
import java.awt.*;
import java.awt.image.*;
public abstract class Transparence
{
/*
* 构建imageSrc的拷贝,象素颜色为mask的显示为透明
*
* @param imageSrc 原始图像
* @param mask mask为Object的实例,因为如果imageSrc为灰度图,或者为索引颜色图,则mask应为指定
* 灰度或索引的数值。如果imageSrc是其他模式的图像,则使用一个Color对象指定颜色值
* @return 返回imageSrc的拷贝,象素颜色为mask的显示为透明
*/
public static BufferedImage createImageByMaskColor(BufferedImage imageSrc, Object mask) {
int x = imageSrc.getWidth(null);
int y = imageSrc.getHeight(null);
Raster rasterSrc = imageSrc.getRaster();
BufferedImage imageDes = new BufferedImage(x, y, BufferedImage.TYPE_4BYTE_ABGR);
WritableRaster rasterDes = imageDes.getRaster();
int[] src = null;
int[] des = new int[4];
int type = imageSrc.getType();
if (type == BufferedImage.TYPE_BYTE_GRAY) {
int cmask = (Integer)mask;
while (--x >= 0)
for (int j = 0; j < y; ++j) {
src = rasterSrc.getPixel(x, j, (int[])null);
if (src[0] == cmask)
des[3] = 0;
else {
des[0] = src[0];
des[1] = src[0];
des[2] = src[0];
des[3] = 255;
}
rasterDes.setPixel(x, j, des);
}
} else if (type == BufferedImage.TYPE_BYTE_INDEXED) {
int cmask = (Integer)mask;
ColorModel cm = imageSrc.getColorModel();
Object data = null;
while (--x >= 0)
for (int j = 0; j < y; ++j) {
src = rasterSrc.getPixel(x, j, (int[])null);
if (src[0] == cmask) {//透明
des[3] = 0;//
} else {
data = rasterSrc.getDataElements(x, j, null);
int argb = cm.getRGB(data);
Color color = new Color(argb, true);
des[0] = color.getRed();
des[1] = color.getGreen();
des[2] = color.getBlue();
des[3] = 255;
}
rasterDes.setPixel(x, j, des);
}
} else {
ColorModel cm = imageSrc.getColorModel();
Color cmask = (Color)mask;
Object data = null;
int maskR, maskG, maskB;
maskR = cmask.getRed();
maskG = cmask.getGreen();
maskB = cmask.getBlue();
while (--x >= 0)
for (int j = 0; j < y; ++j) {
data = rasterSrc.getDataElements(x, j, null);
int rgb = cm.getRGB(data);
int sr, sg, sb;
sr = (rgb & 0xFF0000)>>16;
sg = (rgb & 0xFF00)>>8;
sb = rgb & 0xFF;
if (sr != maskR || sg != maskG || sb != maskB) {
des[0] = sr;
des[1] = sg;
des[2] = sb;
des[3] = 255;
}
else
des[3] = 0;
rasterDes.setPixel(x, j, des);
}
}
return imageDes;
}
/*
* 构建imageSrc的拷贝,象素颜色为mask的显示为透明
*
* @param imageSrc 原始图像
* @param mask 无论原始图像的色彩模式为何种模式,mask统一传入一个
* Color类型的对象指定希望显示为透明的色彩值
* @return 返回imageSrc的拷贝,象素颜色为mask的显示为透明
*/
public static BufferedImage createImageByMaskColorEx(BufferedImage imageSrc, Color mask) {
int x, y;
x = imageSrc.getWidth(null);
y = imageSrc.getHeight(null);
Raster rasterSrc = imageSrc.getRaster();
BufferedImage imageDes = new BufferedImage(x, y, BufferedImage.TYPE_4BYTE_ABGR);
WritableRaster rasterDes = imageDes.getRaster();
int[] src = null;
int[] des = new int[4];
ColorModel cm = imageSrc.getColorModel();
Color cmask = (Color)mask;
Object data = null;
int maskR, maskG, maskB;
maskR = cmask.getRed();
maskG = cmask.getGreen();
maskB = cmask.getBlue();
while (--x >= 0)
for (int j = 0; j < y; ++j) {
data = rasterSrc.getDataElements(x, j, null);
int rgb = cm.getRGB(data);
int sr, sg, sb;
sr = (rgb & 0xFF0000)>>16;
sg = (rgb & 0xFF00)>>8;
sb = rgb & 0xFF;
if (sr == maskR && sg == maskG && sb == maskB)
des[3] = 0;
else {
des[0] = sr;
des[1] = sg;
des[2] = sb;
des[3] = 255;
}
rasterDes.setPixel(x, j, des);
}
return