2013-12-16 100 views
3

我已經嘗試了java文檔中找到的幾種不同方法,以及其他SO問題的幾種解決方案,併成功獲得了Bitmap以轉換爲byte[],並且再次回來。將位圖轉換爲字節數組,字符串,然後一路返回

問題是我現在需要將此字節[]轉換爲String,然後回到byte[],然後再回到Bitmap。要回顧一下,我需要:

Bitmap -> byte[] -> String -> byte[] -> Bitmap

我知道這聽起來很奇怪,但我想要完成必須做這樣。下面是我試過的,如果有人能指出我做錯了什麼,我將不勝感激!

Bitmap bitmap = mv.getDrawingCache(); 

// Convert bitmap to byte[] 
ByteArrayOutputStream output = new ByteArrayOutputStream(bitmap.getByteCount()); 
bitmap.compress(Bitmap.CompressFormat.PNG, 100, output); 
byte[] imageBytes = output.toByteArray(); 

// Convert byte[] to string 
// I have also tried using Base64.encodeToString(imageBytes, 0); 

String encodedString = new String(imageBytes); 

// Convert string to byte[] 
byte[] newImageBytes = encodedString.getBytes(); 

if (imageBytes == newImageBytes) { 
    Toast.makeText(SignatureActivity.this, "SUCCESS!!", Toast.LENGTH_SHORT).show(); 
} else { // Sadly, we always get to this point :(
    Toast.makeText(SignatureActivity.this, "BOOO", Toast.LENGTH_SHORT).show(); 
} 

// Convert byte[] back to bitmap 
bitmap = BitmapFactory.decodeByteArray(newImageBytes, 0, newImageBytes.length); 

同樣,去Bitmap -> byte[] -> Bitmap是成功的,但加入在轉換到String和背面是造成最終Bitmap寫0KB的圖像。

+0

只要表示位圖,字符串包含的內容是否重要? – Jave

+0

只要我最終可以從中檢索原始位圖,就沒關係 –

+0

也許Android上的默認字符編碼始終是UTF-8,但通常應避免使用默認字符編碼。我會在String ctor和getBytes調用中明確使用UTF-8。 –

回答

2

問題不在於轉換,而在於如何驗證結果。使用==來比較兩個數組只返回true,如果它們是相同的數組引用。既然你用byte[] newImageBytes = encodedString.getBytes();創建了一個新的數組,這永遠是錯誤的。 See this question for reference.

在另一方面,如果你要轉讓或以某種方式使用字符串,它可能是更好的使用Base64.encodeToString(imageBytes, Base64.NO_WRAP);得到一個字符串,並與Base64.decode(encodedString, Base64.NO_WRAP)找回來。
您也可以使用copyPixelsToBuffer()方法(例如this question作爲示例)獲取字節數組而不進行壓縮。

+0

我應該補充說,在此之前,我使用'.equals()'來比較字節數組,但它也沒有工作:(我會改回來,並嘗試您的建議,但! –

+1

@RhinoFeeder請注意回答引用的問題使用'Arrays.equals(a1,a2)',而不是'.equals(a2)' – Jave

+1

成功!!非常感謝! –

相關問題