鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 手机系统开发 > J2ME > >

J2ME图片半透明处理(使用图片像素)(仅部分手机支持)

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

其实就是把一张图的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方法直接画出来的就是一个半透明效果的图片了,你可以在画这个图片之前先画一个其他的图片,这样你就可以很明显地看到效果了:

网友评论
<