jcw
jcw

Reputation: 5162

Decode large base64 string

I have created a base64 string from a picture on the SD card using this(below) code, and it works but when I try to decode it (even further below) I get a java.lang.outOfMemoryException, presumably because I am not splitting the string into a reasonable size before I decode it as I am before I encode it.

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){

}

The above code works well, but the problem comes when I try to decode the image with the following code;

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

I have tried this way too

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

Now I assume that I need to split the string up into sections like my image encoding code, but I have no clue how to go about doing it.

Upvotes: 5

Views: 6766

Answers (3)

Prabu
Prabu

Reputation: 1441

You need decode the image in Background thread like AsyncTask or you need reduce your image quality using BitmapFactory . Example:

 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);

Upvotes: 13

18446744073709551615
18446744073709551615

Reputation: 16862

You might try to decode to a temporary file and create image from that file.

As to base64, it is 6 bits per character, or 6x4=24 bits=3 bytes per 4 characters. So if you take 4 characters of base64, you will not break the corresponding 3 bytes. That is, you may split the base64-encoded data at character indices that are a multiple of 4.

Upvotes: 1

stefan bachert
stefan bachert

Reputation: 9624

You have two problem

  • base64 encoding requires much more space. 3 bytes convert to 4 chars (Factor 8/3)
  • you read the whole file at once

in same way your first approach solved this issues. So just use that version

By that way, why are you using decodeByteArray and not decodeFile

Upvotes: 1

Related Questions