您的位置:首页 > 移动开发 > Android开发

Android平台实现位图(Bitmap)的序列化和反序列化

2011-06-23 16:21 651 查看
  对象被序列化后可被保存或传输,这个例子实现了位图的序列化和反序列化。

  这次就对Android工程自带的”icon.png”进行下手。

  程序运行后会在/data/data/breakan.serializable/目录下生成一个bitmap.bin文件,这个文件保存的就是MyBitmap的对象。

  


package breakan.serializable;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;

public class SerializableActivity extends Activity {
private Bitmap bitmap = null;
private ObjectOutputStream oos = null;
private ObjectInputStream ois = null;
// myBitmap1是要被序列化的对象
private MyBitmap myBitmap1 = null;
// myBitmap2是反序列化后得到的对象
private MyBitmap myBitmap2 = null;
private TextView tv1 = null;
private ImageView img1 = null;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.icon))
.getBitmap();
myBitmap1 = new MyBitmap(BytesBitmap.getBytes(bitmap), "icon.png");
tv1 = (TextView) findViewById(R.id.tv1);
img1 = (ImageView) findViewById(R.id.img1);

try {
// 序列化myBitmap对象
oos = new ObjectOutputStream(new FileOutputStream(
"/data/data/breakan.serializable/bitmap.bin"));
oos.writeObject(myBitmap1);
oos.flush();
// 反序列化myBitmap对象
ois = new ObjectInputStream(new FileInputStream(
"/data/data/breakan.serializable/bitmap.bin"));
myBitmap2 = (MyBitmap) ois.readObject();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (oos != null) {
oos.close();
}
if (ois != null) {
ois.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}

tv1.setText(myBitmap2.getName());
img1.setImageBitmap(BytesBitmap.getBitmap(myBitmap2.getBitmapBytes()));
}

}

/**
* 因为Bitmap没有实现序列化,所以不能直接在序列化类(MyBitmap)中使用
* BytesBitmap用于实现Bitmap和byte[]间的相互转换
* @author joran
*
*/
class BytesBitmap {
public static Bitmap getBitmap(byte[] data) {
return BitmapFactory.decodeByteArray(data, 0, data.length);
}

public static byte[] getBytes(Bitmap bitmap) {
ByteArrayOutputStream baops = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG, 0, baops);
return baops.toByteArray();
}
}

/**
* MyBitmap是要被序列化的类
* 其中包含了通过BytesBitmap类得到的Bitmap中数据的数组
* 和一个保存位图的名字的字符串,用于标识图片
* @author joran
*
*/
class MyBitmap implements Serializable {
/**
* serialVersionUID解释:
* http://www.blogjava.net/invisibletank/archive/2007/11/15/160684.html */
private static final long serialVersionUID = 1L;
private byte[] bitmapBytes = null;
private String name = null;

public MyBitmap(byte[] bitmapBytes, String name) {
// TODO Auto-generated constructor stub
this.bitmapBytes = bitmapBytes;
this.name = name;
}

public byte[] getBitmapBytes() {
return this.bitmapBytes;
}

public String getName() {
return this.name;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: