2016-02-09 3 views
2

У меня проблема, взяв выбранный снимок галереи и хочу сохранить его сначала как Base64String в XML-файле (для последующего использования. Например, если вы выходите из приложения и снова открываете его).Как получить Base64 String из InputStream?

Как вы можете видеть, что я получаю изображение на InputStream

Но прежде всего onClick метода:

public void onClick(DialogInterface dialog, int which) { 
        pictureActionIntent = new Intent(Intent.ACTION_GET_CONTENT); 
        pictureActionIntent.setType("image/*"); 
        startActivityForResult(pictureActionIntent,GALLERY_PICTURE); 
       } 

Сейчас в onActivityResult метод, который я хочу, чтобы сохранить изображение из InputStream в Base64String ,

case GALLERY_PICTURE: 

if (resultCode == RESULT_OK && null != data) { 
    InputStream inputstream = null; 
    try { 
      inputstream = getApplicationContext().getContentResolver().openInputStream(data.getData()); 
      Base64InputStream in = new Base64InputStream(inputstream,0); 
    } catch (IOException e) { 
      e.printStackTrace(); 
} 

@EDIT Это то, что я делаю после создания base64 строки.

Bitmap bmp = base64EncodeDecode.decodeBase64(Items.get("image")); 
Image1.setImageBitmap(bmp); 

И это метод декодирования:

public Bitmap decodeBase64(String input) { 
    byte[] decodedByte = Base64.decode(input, Base64.DEFAULT); 
    return BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length); 
} 

Я пытался использовать Base64InputStream, но без успеха. Не могли бы вы дать мне подсказку, как добраться от InputStream до Base64String?

Сколько шагов потребуется, не имеет значения.

Я надеюсь, что кто-то может мне помочь!

С уважением!

ответ

3

Написать эти строки в onActivityResult методе

try { 
    // get uri from Intent 
    Uri uri = data.getData(); 
    // get bitmap from uri 
    Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri); 
    // store bitmap to file 
    File filename = new File(Environment.getExternalStorageDirectory(), "imageName.jpg"); 
    FileOutputStream out = new FileOutputStream(filename); 
    bitmap.compress(Bitmap.CompressFormat.JPEG, 60, out); 
    out.flush(); 
    out.close(); 
    // get base64 string from file 
    String base64 = getStringImage(filename); 
    // use base64 for your next step. 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

private String getStringImage(File file){ 
    try { 
     FileInputStream fin = new FileInputStream(file); 
     byte[] imageBytes = new byte[(int)file.length()]; 
     fin.read(imageBytes, 0, imageBytes.length); 
     fin.close(); 
     return Base64.encodeToString(imageBytes, Base64.DEFAULT); 
    } catch (Exception ex) { 
     Log.e(tag, Log.getStackTraceString(ex)); 
     toast("Image Size is Too High to upload."); 
    } 
    return null; 
} 

вы можете использовать base64 строки изображения.

Также не забудьте добавить разрешения в AndroidManifest.xml файле READ_EXTERNAL_STORAGE и WRITE_EXTERNAL_STORAGE

EDIT :: Decode base64 в растровом

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

Надеется, что это будет работать.

+0

удивительный! спасибо за ваш код! вы можете сказать мне, что 'format.format (new Date ...' is? – raymondis

+0

ohhh., который использовался для форматирования текущей даты на 'dd_MM_yyyy_hh_mm_ss_aa' в этом формате. Я отредактирую ответ. – ELITE

+0

о, да, конечно, спасибо. – raymondis

0

Это должно работать:

public static byte[] getBytes(Bitmap bitmap) {  
    try{ 

    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    stream.flush(); 
    //bitmap.compress(CompressFormat.PNG, 98, stream); 
    bitmap.compress(CompressFormat.JPEG, 98, stream); 
    //bitmap.compress(Bitmap.CompressFormat.JPEG, 90, stream); 
    return stream.toByteArray(); 
    } catch (Exception e){ 
     return new byte[0]; 
    } 
} 

public static String getString(Bitmap bitmap){ 
    byte [] ba = getBytes(bitmap); 
    String ba1= android.util.Base64.encodeToString(ba, android.util.Base64.DEFAULT);   
    return ba1; 
} 

Получил этот код от чего я использую в качестве приложения, раздел его до самого основного, насколько я знаю.

+0

но как поступать из InputStream в Bitmap? – raymondis

0

Если вы выбираете изображение из галереи, то почему вы сохраняете его как строку Base64 в xml-файле, вы можете повторно использовать это изображение из галереи.

Для этого сохраните URL-адрес изображения в SharedPreferences и снова используйте этот URL-адрес для показа изображения.

Edit:

Если вы хотите сохранить его локально, то вы можете использовать базы данных SQLite, чтобы сохранить его, для более детальной информации посетите this ссылку.

+0

, это было мое первое решение. Но что, если пользователь удалит изображение? Я хочу сохранить его в xml, чтобы сделать его независимым от исходного файла – raymondis

+0

@raymondis см. обновленный ответ. –

Смежные вопросы