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

本文档提供了一种在JAVA中实现图像透明效果的方法,包括使用BufferedImage类创建带有透明通道的图像。代码示例展示了如何通过设置图像的特定像素为透明,以及如何创建渐进透明图像。此外,还提供了创建灰度图像并保留或设定透明度的函数。
摘要由CSDN通过智能技术生成
我支持开源,因此我会把自己未涉及公司利益的代码和思想贴出来。以前要求回复邮箱,因为我想看看有没有人要这些东西。
以前家里不能上网,只能去女朋友那蹭网,没时间维护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 
=
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、付费专栏及课程。

余额充值