【问题标题】:How to Serialize a Bitmap in Android如何在 Android 中序列化位图
【发布时间】:2014-08-09 04:53:28
【问题描述】:

我正在尝试保存对象列表的状态。对象类中的一个字段是位图。由于位图不可序列化,我已经实现了自己的位图类,该类实现了可序列化。我已经查看了创建此类的其他问题,似乎它应该可以工作。但是当我运行应用程序时,它在我的 serializableBitmap 类中执行 writeObject 方法后立即崩溃。但是当它崩溃时,它并没有说它不幸停止工作,而只是简单地回到主屏幕。它也不会在 LogCat 中输出任何错误消息。所以我不知道是什么导致了崩溃。这是我的 serializableBitmap 类:

public class serializableBitmap implements Serializable {


private static final long serialVersionUID = -5228835919664263905L;
private Bitmap bitmap; 

public serializableBitmap(Bitmap b) {
    bitmap = b; 
}

// Converts the Bitmap into a byte array for serialization
private void writeObject(ObjectOutputStream out) throws IOException {
    ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
    boolean success = bitmap.compress(Bitmap.CompressFormat.PNG, 0, byteStream);
    byte bitmapBytes[] = byteStream.toByteArray();
    if (success)
    out.write(bitmapBytes, 0, bitmapBytes.length);
}

// Deserializes a byte array representing the Bitmap and decodes it
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
    ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
    int b;
    while((b = in.read()) != -1)
        byteStream.write(b);
    byte bitmapBytes[] = byteStream.toByteArray();
    bitmap = BitmapFactory.decodeByteArray(bitmapBytes, 0, bitmapBytes.length);
}

public Bitmap getBitmap() {
    return this.bitmap;
}

}

任何帮助将不胜感激。

哦,在包含位图的对象类中,我实现了 Parcelable,然后在我调用的 writeToParcel 方法中

dest.writeList(bitmaps);

位图是

private ArrayList<serializableBitmap> bitmaps; 

【问题讨论】:

  • 在压缩方法中,您将质量设置为零。这可不好。
  • 您可以保存一个状态变量,然后重新加载与该数字对应的位图。

标签: java android serializable android-bitmap


【解决方案1】:

对于较大的位图,我也遇到了同样的问题。较小的位图(约 500 x 300 像素)效果很好。

尽量避免序列化大型位图,而是将它们加载到需要它们的位置。例如,您可以序列化它们的 URL 并稍后加载它们或将它们写入本地存储。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    相关资源
    最近更新 更多