2016-01-19 142 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; 
}