2013-06-24 4 views
2

Я хотел бы загрузить изображение из галереи, а затем преобразовать его в base64.Android конвертировать изображение из галереи в base64 результат OutOfMemory Exception

Это звучит не так сложно. Так я DOD это так:

прежде всего открытую галерею и выбрать изображение:

picteureBtn.setOnClickListener(new View.OnClickListener() { 
      private Uri imageUri; 

      public void onClick(View view) { 
       Intent i = new Intent(
         Intent.ACTION_PICK, 
         android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 

       startActivityForResult(i, RESULT_LOAD_IMAGE); 

      } 
     }); 

второй onActivityResult:

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) { 
      Uri selectedImage = data.getData(); 
      String[] filePathColumn = { MediaStore.Images.Media.DATA }; 

      Cursor cursor = getContentResolver().query(selectedImage, 
        filePathColumn, null, null, null); 
      cursor.moveToFirst(); 

      int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
      picturePath = cursor.getString(columnIndex); 
      cursor.close(); 


     } 


    } 

и для конечного пути я хочу, чтобы расшифровать мой image, который в picutrePath

   String b64; 
       StringEntity se; 
       String entityContents=""; 
       if (!picturePath.equals("")){ 
        Bitmap bm = BitmapFactory.decodeFile(picturePath); 
        ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
        bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); 

        byte[] b = baos.toByteArray(); 
        b64=Base64.encodeToString(b, Base64.DEFAULT); 
       } 

Unfortunatly я получаю:

06-24 16:38:14.296: E/AndroidRuntime(3538): FATAL EXCEPTION: main 
06-24 16:38:14.296: E/AndroidRuntime(3538): java.lang.OutOfMemoryError 
06-24 16:38:14.296: E/AndroidRuntime(3538):  at java.io.ByteArrayOutputStream.toByteArray(ByteArrayOutputStream.java:122) 

Может ли кто-нибудь указать мне, где я совершаю ошибку?

ответ

3

Есть много статей, говорящих об этом, в основном вам нужно будет рассчитать размеры перед тем, как их декодировать в Bitmap, посмотрите на класс BitmapFactory. У меня есть альтернативное решение для вас, так как вы выбираете изображение из галереи, вы можете можете получить Bitmap в activityForResult, как это:

Bitmap image = (Bitmap) data.getExtras().get("data"); 

и вы можете начать свой Intent для получения изображения, как:

Intent intent = new Intent();  
intent.setType("image/*"); 
intent.setAction(Intent.ACTION_GET_CONTENT); 
startActivityForResult(intent, RESULT_LOAD_IMAGE); 
5

Я хотел бы предложить, чтобы изменить

Bitmap bm = BitmapFactory.decodeFile(picturePath); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
//added lines 
bm.recycle(); 
bm = null; 
//added lines 
byte[] b = baos.toByteArray(); 
b64=Base64.encodeToString(b, Base64.DEFAULT); 

Таким образом, вы не загружая Bitmap дважды в памяти приложения.