J2ME图片半透明处理(使用图片像素)

J2ME图片半透明处理代(使用图片像素):

其实就是把一张图的argb值都取出来存在一个整型数组里(用Image对象的getRGB方法),然后用循环逐一修改argb值得最高位(最高位的8个2进制值代表了阿尔法通道也不什么的,反正就是透明度),再用Graphics 的drawRGB方法以那个修改后的整型数组为参数画出图像。

 

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


public class Midlet extends MIDlet
{

    private Display display;
    private TCanvas tc;
    public void startApp()
    {
        this.display = Display.getDisplay(this);
        this.tc = new TCanvas();
        this.display.setCurrent(tc);
    }

    public void pauseApp()
    {
    }

    public void destroyApp( boolean unconditional )
    {
    }
}

======================================================================


import java.io.IOException;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;

public class TCanvas extends Canvas
{

    Image image;//要处理的图片
    int argb[];

    public TCanvas()
    {
        super();
        try
        {
            //创建图片对象(即原始图片,不透明)
            image = Image.createImage( "/qq.png" );
        } catch( IOException e )
        {
            e.printStackTrace();
        }
       
        //下面步骤进行图片透明处理
        argb = new int[ image.getWidth() * image.getHeight() ];
        image.getRGB( argb, 0, image.getWidth(), 0, 0, image.getWidth(), image.getHeight() );//获得图片的ARGB值
        int a = 100;//把象素的透明度都设置为100
        for( int i = 0; i < argb.length; i ++ )
        {
            argb[i] = ( a << 24 ) | ( argb[i] & 0x00FFFFFF );// 修改最高2位的值
        }

    }

    protected void paint( Graphics g )
    {
    
        //清屏
        g.setColor(0xffffff);
        g.fillRect(0,0,this.getWidth(),this.getHeight());
        g.setColor(0);
       
       
        g.drawImage(image,0,0,Graphics.TOP|Graphics.LEFT);
        g.drawRGB(argb,0,image.getWidth(),0,100,image.getWidth(),image.getHeight(),true);// 画象素数组
    }
}


=======================================================================

说明:


  在PNG里每个象素是一个ARBG格式,是一个8位的十六进制的数字,比如0xff121212,这个东西描述了图片的一个象素,我们可以通过Image类中的getRGB(int[] rgbData, int offset, int scanlength, int x, int y, int width, int height) 方法获得一个rgbData,这个rgbData就保存了图片所对应的象素信息,取出象素信息之后我们需要对其进行透明效果的处理,透明效果的值是保存在8位中的最高2位,你可以把这个象素值转换成16进制输出,一般情况下最高2位应该都是为FF,也就是不透明,我们现在需要把这个FF改成一个比他小的值,那么我们的图片就透明了,最高位为00的时候图片就全透明了。

  其实8位16进制对应了32位的2进制,那么我们可以通过下面的方法取出他的最高2位:

  A = Argb>>24//把这个数向右移动24位,那么剩下的8位就是我们要的最高位了

  修改之后我们再通过下面的方法可以把他存回去 Argb = a<<24 |( argb & 0x00FFFFFF);

  那么我们通过循环把这个图片的所有象素信息都改变之后,在用改变的象素信息来构造一个图片,或者这个通过我们的Graphics 下面的drawRGB方法直接画出来的就是一个半透明效果的图片了,你可以在画这个图片之前先画一个其他的图片,这样你就可以很明显地看到效果了:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值