2016-08-29 7 views
2

Я пробовал следующий код для кодирования растрового изображения в строку base64, но я всегда ошибаюсь в кодировке.Bitmap to Base64 String

К сожалению, filePath - путь к файлу изображения.

public String encode(String filePath) { 
    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    Bitmap bitmap = BitmapFactory.decodeFile(filePath, options); 
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); 
    byte[] byte_arr = stream.toByteArray(); 
    return Base64.encodeToString(byte_arr, Base64.DEFAULT); 
} 

Как узнать, если я ошибаюсь в кодировке? Я использую этот сайт:

http://codebeautify.org/base64-to-image-converter

+1

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

+0

путь к изображению прав, я проверил его. Я не знаю, что не так. – Ofek

+0

Вы можете подпаять 'Base64.NO_PADDING' вместо/orred в' DEFAULT', то есть без конечных '=' s. –

ответ

0

Попробуйте это:

public String getImageEncodedData(String path) { 
     File f = new File(path); 
     Bitmap imageBitmap = null; 
     try { 
      imageBitmap = BitmapFactory.decodeStream(new FileInputStream(f)); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 
     //added for testing base 64 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     imageBitmap.compress(Bitmap.CompressFormat.JPEG, 80, baos); 
     byte[] imageBytes = baos.toByteArray(); 
     String mImageEncodedString = Base64.encodeToString(imageBytes, Base64.DEFAULT); 
//  Log.e("TAG", "imageEncodedString: " + mImageEncodedString); 
     return mImageEncodedString; 
    } 
3

Попробуйте этот код он делает правильную кодировку для меня. Надеюсь, это поможет вам.

public String getStringImage(Bitmap bmp) { 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
byte[] imageBytes = baos.toByteArray(); 
String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT); 
return encodedImage; 
} 
0

как @kdeogharkar указывая, ваш код выглядит хорошо.

Сначала проверьте, есть ли у вас правильный путь к файлу. Затем проверьте, требуется ли вам разрешение при доступе к внешнему файлу.

Для обработки OOM в то время как мы загрузке большого масштаба изображения, мы можем использовать:

File sd = Environment.getExternalStorageDirectory(); 
File image = new File(sd+filePath, imageName); 
BitmapFactory.Options bmOptions = new BitmapFactory.Options(); 
Bitmap bitmap = BitmapFactory.decodeFile(image.getAbsolutePath(),bmOptions); 
bitmap = Bitmap.createScaledBitmap(bitmap,parent.getWidth(),parent.getHeight(),true); 

Затем с помощью следующей декодирования и кодирования метод:

public static String encodeToBase64(Bitmap image, Bitmap.CompressFormat compressFormat, int quality) 
{ 
    ByteArrayOutputStream byteArrayOS = new ByteArrayOutputStream(); 
    image.compress(compressFormat, quality, byteArrayOS); 
    return Base64.encodeToString(byteArrayOS.toByteArray(), Base64.DEFAULT); 
} 

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

Пример использования:

String myBase64Image = encodeToBase64(myBitmap, Bitmap.CompressFormat.JPEG, 100); 
Bitmap myBitmapAgain = decodeBase64(myBase64Image); 

ПРИМЕЧАНИЕ
этот ответ смешивается с:

  1. https://stackoverflow.com/a/28351881/4758255
  2. https://stackoverflow.com/a/9768973/4758255
0

пытаются использовать NO_WRAP вместо DEFAULT

String stringEncode = Base64.encodeToString(byte_arr, Base64.NO_WRAP); 
    return stringEncode; 

И использовать этот online tool конвертировать base64 строку (stringEncode) в изображение. Если он способен генерировать изображение, ваша строка base64 верна.

+0

все еще не работает = \ – Ofek

+0

Что такое настройка параметров при чтении пути к файлу. Это ARGB_8888? @Ofek – KDeogharkar