MIDP2.0中提供了对图片的象素级的处理,利用这一点,我们可以对图片进行相关的处理,比如半透明,把彩色图片处理成灰度图片,以及图片变色效果都可以在J2ME里很方便地实现。
在进行这些操作之前,我们必须先了解JAVA中的一些位操作符:
<<,>>,&,|,主要是这几个操作符,下面我们就开始我们的操作
1、半透明处理
在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方法直接画出来的就是一个半透明效果的图片了,你可以在画这个图片之前先画一个其他的图片,这样你就可以很明显地看到效果了:
import java.io.IOException; import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.Image; /** * @author 刘军 * @version 1.0 */ public class TCanvas extends Canvas { Image image;//要处理的图片 int argb[]; public TCanvas() { super(); try { image = Image.createImage("/test.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 temp; 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.drawImage(image,0,0,Graphics.TOP|Graphics.LEFT); g.drawRGB(argb,0,image.getWidth(),0,100,image.getWidth(),image.getHeight(),true);// 画象素数组 } } |