2013-04-07 1 views
2

Я ищу наиболее эффективный способ преобразования файла изображения в Base64 String в Android.Каков наиболее эффективный способ конвертировать изображение в Base64 в Android?

Изображение должно быть отправлено в одну строку Base64 сразу в бэкэнд.

Сначала я использую imageToByteArray, а затем imageToBase64, чтобы получить строку.

public static byte[] imageToByteArray(String ImageName) throws IOException { 
    File file = new File(sdcard, ImageName); 
    InputStream is = new FileInputStream(file); 

    // Get the size of the file 
    long length = file.length(); 

    // Create the byte array to hold the data 
    byte[] bytes = new byte[(int)length]; 

    // Read in the bytes 
    int offset = 0; 
    int numRead = 0; 
    while (offset < bytes.length 
      && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) { 
     offset += numRead; 
    } 

    //Close input stream 
    is.close(); 
    // Ensure all the bytes have been read in 
    if (offset < bytes.length) { 
     throw new IOException("Could not completely read file "+file.getName()); 
    } 
    return bytes; 
} 

    public String imageToBase64(String ImageName){  
    String encodedImage = null; 
    try { 
     encodedImage = Base64.encodeToString(imageToByteArray(ImageName), Base64.DEFAULT); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return encodedImage; 
} 
+0

Вы можете получить массив байтов и разделить его на несколько вспомогательных массивов и закодировать их в отдельных потоках, прежде чем объединять результаты для получения окончательной строки. –

ответ

0

Ниже, как я справиться с этим в основном, это в обратном вызове gotActivityResults после вызова сборщика изображения активности. Он похож на ваш, но я думаю, что он будет более эффективен, потому что toByteArray из потока - это собственный код c за ним, а не java-цикл в вашем.

     Uri selectedImage = imageReturnedIntent.getData(); 
         InputStream imageStream = getContentResolver().openInputStream(selectedImage); 
         Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream); 
         ByteArrayOutputStream bao = new ByteArrayOutputStream(); 

         yourSelectedImage.compress(Bitmap.CompressFormat.JPEG, 90, bao); 

         byte [] ba = bao.toByteArray(); 

         String ba1= Base64.encodeToString(ba, 0); 

         HashMap<String, String > params = new HashMap<String, String>(); 
         params.put("avatar", ba1); 
         params.put("id", String.valueOf(uc.user_id)); 
         params.put("user_id", String .valueOf(uc.user_id)); 
         params.put("login_token", uc.auth_token); 
         uc.setAvatar(params); 
+1

Вы загружаете Bitmap в память, которая потребляет много памяти. У меня был код, похожий на ваш, и изменил его на то, что у меня на OP сейчас. – Firze