2016-01-19 139 views
2
public String encodeTobase64(Bitmap image){ 
    System.gc(); //For memory efficiency 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    image.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
    byte[] b = baos.toByteArray(); 
    String imageEncoded = null; 
    imageEncoded = Base64.encodeToString(b, Base64.DEFAULT); 
    return imageEncoded; 
} 

我可以字節數組分割成多個部分,然後在不同的線程上運行他們的編碼,以便它可以快速對較大的圖像,然後在最後加入他們的行列。Android的Base64編碼

+0

你能解釋正是你想要達到什麼樣的?我認爲它不會對你的要求有什麼好處 – Calvin

回答

0

如果您一次處理3的倍數的字節,它實際上是可能的,如this post所示。

否則,由於Base64算法的工作方式,這將不起作用。分割數組時,每個分段可能會有更多或更少的填充,因此當最後加入String並嘗試執行相反操作時(回到byte[]),它可能會失敗。

這裏是一個小例子:

String test = "This is a test"; 
byte[] testBytes = test.getBytes(); 
int mid = testBytes.length/2; 

byte[] part1 = Arrays.copyOfRange(testBytes, 0, mid); 
byte[] part2 = Arrays.copyOfRange(testBytes, mid, testBytes.length); 

Encoder base64Encoder = Base64.getEncoder(); 
System.out.println(base64Encoder.encodeToString(testBytes)); 
System.out.println(base64Encoder.encodeToString(part1)); 
System.out.println(base64Encoder.encodeToString(part2)); 

這將輸出:

VGhpcyBpcyBhIHRlc3Q= 
VGhpcyBpcw== 
IGEgdGVzdA== 

注意,如果你把後兩個Strings他們一起不等於第一。 =字符是填充。

如果您擔心Base64編碼圖像的效率,您可以在單個後臺線程上執行操作。您可以使用AsyncTask作爲一個選項來幫助您這樣做。

0

對於部分編碼base64,首先您需要了解base64編碼的工作方式。檢查下面的網址。

  1. http://www.hcidata.info/base64.htm

  2. https://blogs.oracle.com/rammenon/entry/base64_explained

對於例如在字符串的情況下。 你只需要,如果你想用base64轉換「12345678aa」然後

轉換成以下順序

  1. 123到字符串數組分爲大小3 例如陣列 - MTIz
  2. 456 - NDU2
  3. 78A - Nzhh
  4. 一個 - YQ ==

現在只需合併你的結果。這將成爲「MTIzNDU2NzhhYQ ==」。這是「12345678aa」的編碼值。

CHEARS ................. :)

0

你忘了將其轉換爲字節數組之前解碼位圖。

添加以下行

Bitmap bm = BitmapFactory.decodeFile(image); 

System.gc(); //For memory efficiency 

所以,你的代碼如下:

public String encodeTobase64(Bitmap image){ 

    System.gc(); //For memory efficiency 
    Bitmap bm = BitmapFactory.decodeFile(image); 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
    byte[] b = baos.toByteArray(); 
    String imageEncoded = null; 
    imageEncoded = Base64.encodeToString(b, Base64.DEFAULT); 
    return imageEncoded; 
}