在 J2ME 里,把本来好好呆着的 图 片 颠 倒 过 来,好像有个 Sprite 类 里面封装了一些方法。
本人 刚 学 J2ME 几天,昨天不知道有 这 回事, 为 了能把 图 片旋 转过 来,自己做了个小方法
Image 类 中, getRGB 方法,是把 图 片的 RGB 颜 色数 值 存 储 成一 维 数 组 。
用法是这样: img .getRGB(srcRGB, 0, width, 0, 0, width, height );
具体参数含义可以参考 MIDP 的 API 文档。
本来 RGB 颜 色数 值 是 2 维 矩 阵 ,存 储 成 1 维 数 组 时,还需要再知道 2 维数组的宽度,就可以还原了。
如 0 1 2 3 4 5 6 7 8 9 10 11, 如果知道宽度是 3 ,就能把这个 1 维数组还原为 2 维的 0 1 2 3 4 5 6 7 8 9 10 11 。
Image 类中, 还有个方法createImage
是根据1维的RGB数组,将它转换为2维的颜色矩阵,以该颜色矩阵创建一个图形。
用法是这样:createRGBImage(srcRGB,width,height, true);
1维数组转换为矩阵的原理同上。
原图片的RGB颜色矩阵能够得到,要想颠倒就是把该矩阵转换一下就好了。
比如将图1
转换为图2
即可以转换到求矩阵的转秩这个问题上。
我做的1维数组“假装”是2维矩阵,返回结果为1维数组,也“假装”是2维矩阵的方法如下
//1维数组假装成矩阵,然后转制
private int[] arrAnti(int[] src,int width,int height)
{
int[] rst=new int[width*height];
for(int i=0;i<width*height;i++)
{
rst[i]=src[i*width-(i/height)*(width*height-1)];
}
return rst;
}
src是原数组,返回的rst是转秩后的数组。
将这个数组应用到系统中,代码如下:
package com.miao.anti;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class Anti extends MIDlet {
Display dis;
Image img=null;
Image img1=null;
MyCanvas mc=new MyCanvas();
//1维数组假装成矩阵,然后转制
private int[] arrAnti(int[] src,int width,int height)
{
int[] rst=new int[width*height];
for(int i=0;i<width*height;i++)
{
rst[i]=src[i*width-(i/height)*(width*height-1)];
}
return rst;
}
public Anti() {
dis=Display.getDisplay(this);
try
{
img=Image.createImage("/img.png");
}catch(Exception ex){}
int width=img.getWidth();
int height=img.getHeight();
int[] srcRGB=new int[width*height];
img.getRGB(srcRGB, 0, width, 0, 0, width,height);
srcRGB=this.arrAnti(srcRGB, width, height);
img1=Image.createRGBImage(srcRGB,height,width, true);
dis.setCurrent(mc);
}
protected void pauseApp() {
// TODO Auto-generated method stub
}
class MyCanvas extends Canvas{
protected void paint(Graphics g) {
g.drawImage(img,0,0,Graphics.LEFT|Graphics.TOP);
g.drawImage(img1,100,0,Graphics.LEFT|Graphics.TOP);
}
}
}
运用了getRGB和createRGBImage这两个API方法,
再加上自己做的arrAnti方法,就可以实现把图片放倒啦~