2012-02-09 55 views
2

我試圖在Android中保留圖像。我最終決定創建一個包裝對象來處理序列化。我預計它是次優的。在Android中序列化/反序列化圖像的最佳方式

我的問題:它怎麼能更好地完成(特別是關於性能,而不是遭受來自多個串行化的圖像退化)?

public class SerializableImage implements Serializable { 

private static final long serialVersionUID = 1L; 

private static final int NO_IMAGE = -1; 

private Bitmap image; 

public Bitmap getImage() { 
    return image; 
} 

public void setImage(Bitmap image) { 
    this.image = image; 
} 

private void writeObject(ObjectOutputStream out) throws IOException { 
    if (image != null) { 
     final ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
     image.compress(Bitmap.CompressFormat.PNG, 100, stream); 
     final byte[] imageByteArray = stream.toByteArray(); 
     out.writeInt(imageByteArray.length); 
     out.write(imageByteArray); 
    } else { 
     out.writeInt(NO_IMAGE); 
    } 
} 

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException{ 

    final int length = in.readInt(); 

    if (length != NO_IMAGE) { 
     final byte[] imageByteArray = new byte[length]; 
     in.readFully(imageByteArray); 
     image = BitmapFactory.decodeByteArray(imageByteArray, 0, length); 
    } 
} 
} 
+0

在調用decodeByteArray(最後一行)之前沒有一行存在。您應該使用以下語句將輸入流讀入新創建的數組:in.readFully(imageByteArray)。在添加此行後,代碼很有用。 – Idan 2013-10-09 22:31:42

回答

1

由於PNG是無損格式,您應該沒有質量下降。你應該注意的不是你如何寫/讀文件/從文件讀取圖像,而是多久你這樣做。我發現使用弱引用創建內存緩存大大減少了IO調用。另外請注意,即使讓系統垃圾收集舊圖像,它們也會在本機代碼中緩存更長時間。唯一可以幫助您處理這個問題的方法是調用Bitmap.recycle

相關問題