MIDP2.0中提供了对图片的象素级的处理,利用这一点,我们可以对图片进行相关的处理,比如半透明,把彩色图片处理成灰度图片,以及图片变色效果都可以在J2ME里很方便地实现。
在进行这些操作之前,我们必须先了解JAVA中的一些位操作符:
<<,>>,&,|,主要是这几个操作符,下面我们就开始我们的操作
半透明处理
在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方法直接画出来的就是一个半透明效果的图片了。
- public class TransparantCanvas extends Canvas {
- Image image;// 要处理的图片
- int argb[];
- public TransparantCanvas() {
- 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);// 画象素数组
- }
- }
- public class TransparaentMIDlet extends MIDlet {
- private Display display;
- private TransparantCanvas canvas;
- public TransparaentMIDlet() {
- display=Display.getDisplay(this);
- canvas=new TransparantCanvas();
- }
- protected void destroyApp(boolean arg0) {
- }
- protected void pauseApp() {
- }
- protected void startApp() throws MIDletStateChangeException {
- display.setCurrent(canvas);
- }
- }