解码大的base64字符串

时间:2013-04-09 09:06:36

标签: android base64

我使用这个(下面)代码从SD卡上的图片创建了一个base64字符串,它可以正常工作,但是当我尝试解码它时(甚至在下面),我得到一个java.lang.outOfMemoryException,大概是因为我在我编码之前,我没有将字符串拆分为合理的大小。

byte fileContent[] = new byte[3000];
StringBuilder b = new StringBuilder();
try{
     FileInputStream fin = new FileInputStream(sel);
     while(fin.read(fileContent) >= 0) {
    b.append(Base64.encodeToString(fileContent, Base64.DEFAULT));
     }
}catch(IOException e){

}

上面的代码效果很好,但是当我尝试使用以下代码解码图像时会出现问题;

byte[] imageAsBytes = Base64.decode(img.getBytes(), Base64.DEFAULT);
ImageView image = (ImageView)this.findViewById(R.id.ImageView);
image.setImageBitmap(
    BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length)
);

我也尝试过这种方式

byte[] b = Base64.decode(img, Base64.DEFAULT);
Bitmap bitmap = BitmapFactory.decodeByteArray(b, 0, b.length);
image.setImageBitmap(bitmap);

现在我假设我需要将字符串拆分为像我的图像编码代码一样的部分,但我不知道如何去做。

3 个答案:

答案 0 :(得分:13)

您需要在像AsyncTask这样的后台线程中解码图像 要么 您需要使用BitmapFactory降低图像质量。 例如:

 BitmapFactory.Options options = new BitmapFactory.Options();

            options.inSampleSize = 2;
            options.inPurgeable=true;
        Bitmap bm = BitmapFactory.decodeFile("Your image exact loaction",options);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();  
        bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); //bm is the bitmap object 

        byte[] b = baos.toByteArray(); 
        String encodedImage = Base64.encodeToString(b, Base64.DEFAULT);

答案 1 :(得分:1)

你有两个问题

  • base64编码需要更多空间。 3个字节转换为4个字符(因子8/3)
  • 您立刻阅读了整个文件

以同样的方式,您的第一种方法解决了这个问题。所以只需使用该版本

通过这种方式,你为什么使用 decodeByteArray 而不是 decodeFile

答案 2 :(得分:1)

您可能会尝试解码为临时文件并从该文件创建图像。

对于base64,每个字符为6位,或者每4个字符为6x4 = 24位= 3个字节。 因此,如果你使用base64的4个字符,你将不会破坏相应的3个字节。 也就是说,您可以将base64编码的数据拆分为4的倍数的字符索引。