5

我已经使用这个(下面的)代码从 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);

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

4

3 回答 3

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);
于 2013-04-09T09:14:20.143 回答
1

你有两个问题

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

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

那样的话,你为什么使用decodeByteArray而不是decodeFile

于 2013-04-09T09:14:23.477 回答
1

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

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

于 2013-04-09T09:14:28.080 回答