现在的位置: 首页 > 综合 > 正文

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

2013年10月02日 ⁄ 综合 ⁄ 共 5707字 ⁄ 字号 评论关闭
我支持开源,因此我会把自己未涉及公司利益的代码和思想贴出来。以前要求回复邮箱,因为我想看看有没有人要这些东西。
以前家里不能上网,只能去女朋友那蹭网,没时间维护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

抱歉!评论已关闭.