一种简单的方法在程序中实现透明效果(JAVA)(源代码)

本文档提供了一种在JAVA中实现图像透明效果的方法,包括使用BufferedImage类创建带有透明通道的图像。代码示例展示了如何通过设置图像的特定像素为透明,以及如何创建渐进透明图像。此外,还提供了创建灰度图像并保留或设定透明度的函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我支持开源,因此我会把自己未涉及公司利益的代码和思想贴出来。以前要求回复邮箱,因为我想看看有没有人要这些东西。
以前家里不能上网,只能去女朋友那蹭网,没时间维护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 (-->= 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 (-->= 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 (-->= 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 (-->= 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 imageDes;    
    }

    
/*
     * 创建渐进透明的图像,
     * @param imageSrc imageSrc必须是一个单字节灰度图,
     *                    在生成的图像中原始图像的黑色区域将被视为透明,
     *                    透明度由黑色到白色逐渐降低,到白色时完全不透明
     * <b>createGrayImage()方法返回的BufferedImage对象不能作为这个方法输入
     *            因为createGrayImage()方法返回的是一个四字节灰度图,而该方法的
     *            参数需要的是一个单字节的灰度图(虽然也很容易实现四字节灰度图
     *            的输入,但,或许还是不好)<b>
     * @return 渐进的灰度透明图
     
*/

    
public static BufferedImage createGradientTransparenceImage(BufferedImage imageSrc) 
                            
throws Exception {
        
int type = imageSrc.getType();
        
if (type != BufferedImage.TYPE_BYTE_GRAY && type != BufferedImage.TYPE_BYTE_INDEXED)
            
throw new Exception("Method: " + 
                
"Transparence.createGradientTrasparenceImage(BufferedImage imageSrc)" +
                
" only supports image of which type is gray. please checking your image file's type!");
        
int x, y;
        x 
= imageSrc.getWidth();
        y 
= imageSrc.getHeight();
        Raster rasterSrc 
= imageSrc.getRaster();
        BufferedImage imageDes 
= new BufferedImage(x, y, BufferedImage.TYPE_4BYTE_ABGR);
        WritableRaster rasterDes 
= imageDes.getRaster();
        
int[] src = new int[1];
        
int[] des = new int[]{255255255255};
        
while (-->= 0)
            
for (int j = 0; j < y; ++j) {
                rasterSrc.getPixel(x, j, src);    
                des[
3= src[0];
                rasterDes.setPixel(x, j, des);
            }

        
return imageDes;
    }

    
/*
     * 创造原始图像的灰度图,如果原始图像有透明通道,则会被保留
     * @param imageSrc 原始图像
     * @param reserve 是否保留原始的灰度信息,如果不保留,所有的有效颜色都
     *                    设置为level值(level:0 - 255)
     * @param level 如果不保留原始的灰度信息,则将图像设置成统一的一个灰度值
     *                配合其他方法,可以很容易实现Office2003图标浮起时下面的阴影。
     * @return 原始图像的灰度图
     
*/

    
public static BufferedImage createGrayImage(BufferedImage imageSrc, boolean reserve, int level) {
        
int x, y;
        x 
= imageSrc.getWidth();
        y 
= imageSrc.getHeight();
        
        Raster rasterSrc 
= imageSrc.getRaster();
        ColorModel cm 
= imageSrc.getColorModel();
        BufferedImage imageDes 
= new BufferedImage(x, y, BufferedImage.TYPE_4BYTE_ABGR);
        WritableRaster rasterDes 
= imageDes.getRaster();
        
        
int[] des = new int[]{level, level, level, 0};
        Object inData 
= null;
        
int rgb = 0;
        
int sr = 0;
        
int sg = 0;
        
int sb = 0;
        
while (-->= 0)
            
for (int j = 0; j < y; ++j) {
                inData 
= rasterSrc.getDataElements(x, j, null);
                
if (reserve) {
                    rgb 
= cm.getRGB(inData);
                    sr 
= (rgb & 0xFF0000)>>16;
                    sg 
= (rgb & 0xFF00)>>8;
                    sb 
= rgb & 0xFF;
                    des[
0= des[1= des[2= (sr * 77 + sg * 150 + sb * 29 + 128)>>8;
                }

                
//设置透明通道
                des[3= cm.getAlpha(inData);
                
                rasterDes.setPixel(x, j, des);
            }

        
return imageDes;
    }

    
/*
     * 创建图像,imageMask中被mask指定的区域,在imageSrc中将显示为透明。
     * 
     * imageSrc与imageMask必须长,宽一致
     * @param imageSrc 原始图像
     * @param imageMask 掩码图像
     * @param mask 透明通道,当imageMask是一个索引图、灰度图,mask必须是
     *                一个0-255的数值对象。
     *                 当imageMask是一个其他色彩模式的图像,则mask必须是一个Color对象。
     * @return 原始图像的拷贝。imageMask中被mask指定的区域,在imageSrc中将显示为透明。
     
*/

    
public static BufferedImage createImageByMaskImage(BufferedImage imageSrc, 
                                                        BufferedImage imageMask, 
                                                        Object mask) 
{
        
int x = imageSrc.getWidth();
        
int y = imageSrc.getHeight();
        Raster rasterSrc 
= imageSrc.getRaster();
        ColorModel cm 
= imageSrc.getColorModel();
        Raster rasterMask 
= imageMask.getRaster();
        
        BufferedImage imageDes 
= new BufferedImage(x, y, BufferedImage.TYPE_4BYTE_ABGR);
        WritableRaster rasterDes 
= imageDes.getRaster();
        
        Object inData 
= null;
        
int[] maskArr = null;
        
int[] des = new int[]{0000};
        
int rgb = 0;
        
int sr = 0;
        
int sg = 0;
        
int sb = 0;
        
int type =     imageMask.getType();
        
if (type == BufferedImage.TYPE_BYTE_GRAY || type == BufferedImage.TYPE_BYTE_INDEXED || type == BufferedImage.TYPE_BYTE_BINARY) {
            
int cmask = (Integer)mask;
            maskArr 
= new int[1];
            
while (-->= 0)
                
for (int j = 0; j < y; ++j) {
                    rasterMask.getPixel(x, j, maskArr);
                    
if (maskArr[0!= cmask) {
                        inData 
= rasterSrc.getDataElements(x, j, null);
                        rgb 
= cm.getRGB(inData);
                        sr 
= (rgb & 0xFF0000)>>16;
                        sg 
= (rgb & 0xFF00)>>8;
                        sb 
= rgb & 0xFF;
                        des[
0= sr;
                        des[
1= sg;
                        des[
2= sb;
                        des[
3= 255;
                    }

                    
else
                        des[
3= 0;
                    rasterDes.setPixel(x, j, des);
                }
    
        }
 else {
            Color cmask 
= (Color)mask;
            
int cmr = cmask.getRed();
            
int cmg = cmask.getGreen();
            
int cmb = cmask.getBlue();
            
            
int mr, mg, mb;
            Object maskInData 
= null;
            ColorModel maskCm 
= imageMask.getColorModel();
            
int mrgb = 0;
            
while (-->= 0)
                
for (int j = 0; j < y; ++j) {
                    maskInData 
= rasterMask.getDataElements(x, j, null);
                    mrgb 
= maskCm.getRed(maskInData);
                    mr 
= (mrgb & 0xFF0000)>>16;
                    mg 
= (mrgb & 0xFF00)>>8;
                    mb 
= mrgb & 0xFF;
                    
if (cmr != mr || cmg != mg || cmb != mb) {
                        inData 
= rasterSrc.getDataElements(x, j, null);
                        rgb 
= cm.getRGB(inData);
                        sr 
= (rgb & 0xFF0000)>>16;
                        sg 
= (rgb & 0xFF00)>>8;
                        sb 
= rgb & 0xFF;
                        des[
0= sr;
                        des[
1= sg;
                        des[
2= sb;
                        des[
3= 255;                    
                    }

                    
else 
                        des[
3= 0;
                    rasterDes.setPixel(x, j, des);            
                }

        }

        
return imageDes;        
    }

    
/*
     * 创建图像,imageMask中被mask指定的区域,在imageSrc中将显示为透明。
     * imageSrc与imageMask必须长,宽一致
     * @param imageSrc 原始图像
     * @param imageMask 掩码图像
     * @param mask 透明通道,必须是一个Color对象
     * @return 原始图像的拷贝。imageMask中被mask指定的区域,在imageSrc中将显示为透明。
     
*/

    
public static BufferedImage createImageByMaskImageEx(BufferedImage imageSrc, 
                                                        BufferedImage imageMask, 
                                                        Color mask) 
{
        
int x = imageMask.getWidth();
        
int y = imageMask.getHeight();
        Raster rasterSrc 
= imageSrc.getRaster();
        ColorModel cm 
= imageSrc.getColorModel();
        Raster rasterMask 
= imageMask.getRaster();
        
        BufferedImage imageDes 
= new BufferedImage(x, y, BufferedImage.TYPE_4BYTE_ABGR);
        WritableRaster rasterDes 
= imageDes.getRaster();
        
        Object inData 
= null;
        
int[] maskArr = null;
        
int[] des = new int[]{0000};
        
int rgb = 0;
        
int sr = 0;
        
int sg = 0;
        
int sb = 0;    
        
        Color cmask 
= (Color)mask;
        
int cmr = cmask.getRed();
        
int cmg = cmask.getGreen();
        
int cmb = cmask.getBlue();
        
        
int mr, mg, mb;
        Object maskInData 
= null;
        ColorModel maskCm 
= imageMask.getColorModel();
        
int mrgb = 0;
        
while (-->= 0)
            
for (int j = 0; j < y; ++j) {
                maskInData 
= rasterMask.getDataElements(x, j, null);
                mrgb 
= maskCm.getRGB(maskInData);
                mr 
= (mrgb & 0xFF0000)>>16;
                mg 
= (mrgb & 0xFF00)>>8;
                mb 
= mrgb & 0xFF;
                
if (cmr != mr || cmg != mg || cmb != mb) {
                    inData 
= rasterSrc.getDataElements(x, j, null);
                    rgb 
= cm.getRGB(inData);
                    sr 
= (rgb & 0xFF0000)>>16;
                    sg 
= (rgb & 0xFF00)>>8;
                    sb 
= rgb & 0xFF;
                    des[
0= sr;
                    des[
1= sg;
                    des[
2= sb;
                    des[
3= 255;                    
                }

                
else 
                    des[
3= 0;
                rasterDes.setPixel(x, j, des);            
            }

        
return imageDes;    
    }

    
/*
     * 创建一副imageSrc根据imageGray的灰度变化而产生透明渐进变化的图像
     * imageGray的大小可以是imageSrc的一部分
     * @param imageSrc 原始图像
     * @param sx 原始图与灰度图开始交错的坐标x点
     * @param sy 原始图与灰度图开始交错的坐标y点
     * @param imageGray 灰度图
     * @return 返回imageSrc的拷贝,根据imageGray产生透明的渐进变化
     
*/

    
public static BufferedImage createGradientTransparenceByGrayImage(BufferedImage imageSrc, int sx, int sy, BufferedImage imageGray)
                    
throws Exception {
        
int type = imageGray.getType();
        
if (type != BufferedImage.TYPE_BYTE_GRAY)
            
throw new Exception("Method: " + 
                
"Transparence.createGradientTransparenceByGrayImage(BufferedImage imageSrc, BufferedImage imageGray)" +
                
" only supports that imageGray's type is gray and color bit is 8. please checking your image file's type!");
        
int x, y;
        x 
= imageGray.getWidth();
        y 
= imageGray.getHeight();
        Raster rasterGray 
= imageGray.getRaster();
        Raster rasterSrc 
= imageSrc.getRaster();
        ColorModel cmSrc 
= imageSrc.getColorModel();
        
        BufferedImage imageDes 
= new BufferedImage(x, y, BufferedImage.TYPE_4BYTE_ABGR);
        WritableRaster rasterDes 
= imageDes.getRaster();
        
        
int[] gray = new int[1];
        
int[] des = new int[]{0000};
        Object inData 
= null;
        
int rgb = 0;
        
while (-->= 0)
            
for (int j = 0; j < y; ++j) {
                rasterGray.getPixel(x, j, gray);    
                
if (gray[0!= 0{
                    inData 
= rasterSrc.getDataElements(x+sx, j+sy, null);
                    rgb 
= cmSrc.getRGB(inData);
                    des[
0= (rgb & 0xFF0000)>>16;
                    des[
1= (rgb & 0xFF00)>>8;
                    des[
2= rgb & 0xFF;                    
                    des[
3= gray[0];
                }

                
else 
                    des[
3= 0;
                rasterDes.setPixel(x, j, des);
            }

        
return imageDes;    
    }

}
DEMO的代码: Demo.rar

Java实现图片透明效果,从演示截图可看到,上层图片与下层图片互相重叠,也就是上层图片透明了,看到了下层以的图片,具体的代码实现:   public class HalfTransparentImageDemo extends JFrame {    private Container content = getContentPane(); //获得窗口的容器    private JSlider jSlider = new JSlider(JSlider.HORIZONTAL,0,100,75); //改变图像的透明度    DisplayPanel displayPanel = new DisplayPanel(); //显示图形面板    public HalfTransparentImageDemo() {    super("半透明图片"); //调用父类构造器    jSlider.setPaintTicks(true); //绘制标志位    jSlider.setMajorTickSpacing(25); //设置标志尺寸    jSlider.setMinorTickSpacing(5);    jSlider.setPaintLabels(true); //绘制出数字    jSlider.setBorder(new TitledBorder(BorderFactory.createEmptyBorder(), "图像的透明(%)")); //设置边框    jSlider.addChangeListener(new ChangeListener() { //滑动条jSlider事件处理    public void stateChanged(ChangeEvent ce) {    float alpha =((float) ((JSlider) ce.getSource()).getValue()) / 100;    displayPanel.alpha = alpha; //改变图像的透明度    displayPanel.repaint(); //重绘displayPanel    }    g2d.drawImage(bufImage1, 0, 0, this); //在图形环境绘制缓冲区图像1    g2d.drawString("Destination",5,20); //绘制文字    int compositeRule = AlphaComposite.SRC_OVER; //源排斥目标法合成规则    AlphaComposite alphaComposite=AlphaComposite.getInstance(compositeRule,alpha); //创建AlphaComposite对象    g2d.setComposite(alphaComposite); //设置图形环境的合成方式    g2d.drawImage(bufImage2, 0, 0, this); //在图形环境绘制缓冲区图像2    g2d.drawString("Source",150,20); //绘制文字    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值