j2me中一般要用到RMS,如果用RMS存储图片并取出的话,是要转化为byte[]格式的,怎样存入byte[]数据,很简单
,这个例子只是将图片格式转化为byte[]并用之构造图片。
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import javax.microedition.rms.*;
import java.io.*;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Display;
public class Try extends MIDlet {
public Try() {
// TODO Auto-generated constructor stub
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
protected void pauseApp() {
// TODO Auto-generated method stub
}
protected void startApp() throws MIDletStateChangeException {
// TODO Auto-generated method stub
try{
int buffer=1024;//缓存大小
byte[] bufferData=new byte[buffer];
byte[] data=null;
//建立一个输入流,流的来源是一个图片,eclipse中的话,默认是在res文件夹下
InputStream is=this.getClass().getResourceAsStream("1.jpg");
//建立一个字符数组输出流,rms中只支持byte[]格式,这样方便存取RecordStore
ByteArrayOutputStream baos=new ByteArrayOutputStream();
//numReaded标记实际读入的字符数
int numReaded=0;
while(numReaded!=-1){
//InputStream的read方法重写过一次,有不带参数的read()函数,每次只读入一个字符
//这样很慢不适合在j2me这种小内存机器上运行。下面这个read方法是将输入流读入到字符数组
//bufferData中,0是数组 b 中将写入数据的初始偏移量,为0表示每次从数组开头写入数据。
//buffer表示每次最多读入buffer个字符,如果buffer为0则返回0,如果读到流的末尾返回-1
//numReaded即read的返回值就是表示实际读入字符数组的字符数
numReaded=is.read(bufferData, 0, buffer);
if(numReaded!=-1){
//在字符输出流中每次写下刚刚读入到bufferData中的数据,0是数组中的起始偏移量
//numReaded是这次要读入的字符个数
baos.write(bufferData, 0, numReaded);
}
}
//之所以要用ByteArrayOutputStream句是为了下面这句方便将数据生成字符数组
data=baos.toByteArray();
baos.close();
//创建一个Image可以用createImage方法,该方法重写过6次。也可以用
//方法createRGBImage(rgb, width, height, processAlpha)。我现在就用
//createImage(byte[] imageData, int imageOffset, int imageLength)
//和createImage(InputStream arg)这两个方法。
//因为ByteArrayInputStream是InputStream的子类,所以可以直接用。
//方法1.用字符数组
Image img=Image.createImage(data, 0, data.length);
//方法2.用字符输入流
//ByteArrayInputStream bais=new ByteArrayInputStream(data);
//Image img=Image.createImage(bais);
//下面就很简单了,Canvas没有共用的构造函数,所以每次都要自己定义一个他的子类
//并且重写paint函数。
ImageCanvas canvas=new ImageCanvas();
canvas.img=img;
canvas.repaint();
Display dis=Display.getDisplay(this);
dis.setCurrent(canvas);
}
catch(Exception e){
e.printStackTrace();
}
}
class ImageCanvas extends Canvas{
public Image img=null;
public void paint(Graphics g){
if(g!=null&&img!=null){
g.drawImage(img, this.getWidth()/2-img.getWidth()/2, this.getHeight()/2-img.getHeight()/2, 0);
}
}
}
}
j2me RMS 图片
最新推荐文章于 2014-04-28 20:02:30 发布