2016-08-24 13 views
0

Я хочу загрузить изображение на сервер, который принимает изображения в формате base64. Я использую этот код для кодирования растрового изображения, но он кодирует только половину изображения, а сервер получает только половину части изображения.Получение половины изображения при преобразовании растрового изображения в base64

Это мой код.

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
      photo.compress(Bitmap.CompressFormat.PNG, 10, byteArrayOutputStream); 
      byte[] byteArray = byteArrayOutputStream .toByteArray(); 

      String encoded = Base64.encodeToString(byteArray, Base64.DEFAULT); 
// Send to server(encoded) 

и когда я пытаюсь кодировать изображение из галереи, он выдает сообщение об ошибке и сбой приложения с ошибкой.

java.lang.OutOfMemoryError: Не удалось выделить распределение 15521174 байт с 13777320 свободных байтов и 13МБ до OOM

Я хочу, чтобы закодировать полный образ, любую помощь?

+1

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

+1

поиск по google 'OutOfMemoryError' –

+1

@KZoNE попробуйте мой ответ –

ответ

1

попробовать этот код:

BitmapFactory.Options options; 
options = new BitmapFactory.Options(); 

    // downsizing image as it throws OutOfMemory Exception for larger 
    // images 
    options.inSampleSize = 6; 
    Bitmap bitmap1 = BitmapFactory.decodeFile(fileUri1.getPath(), 
         options); 
       ByteArrayOutputStream baos1 = new ByteArrayOutputStream(); 
       if(bitmap1 != null) { 
        bitmap1.compress(Bitmap.CompressFormat.PNG, 10, baos1); 
        byte[] b1 = baos1.toByteArray(); 
        bitmapstring1 = Base64.encodeToString(b1,  

        Base64.DEFAULT); 
+0

Спасибо за ответ. Но я чувствую, что это снизит качество изображения. На самом деле я не хочу, чтобы он был низкого качества? Знаете ли вы какой-либо код для отправки без снижения качества? Я имею в виду, я думаю, лучше использовать bitmap1.compress (Bitmap.CompressFormat.PNG, 100, baos1); Как вы думаете? – KZoNE

+1

использовать bitmap1.compress (Bitmap.CompressFormat.PNG, 100, baos1); не возникла проблема @KZoNE –

+0

Спасибо, что я решил проблему @Damini – KZoNE

0
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); 
    Log.d(TAG, "getStringImage: "+encodedImage.trim()); 
    return encodedImage; 
} 

попробовать этот

+1

Как этот ответ отличается от кода, который он отправил, (кроме меньшего сжатия) – Doomsknight

+0

Я не видел, что ans перед отправкой моего кода – UserSharma

+0

Я имею в виду код в вопрос. :) Другой ответ другой – Doomsknight

1

вы должны получать «OutOfMemoryError», потому что может быть вы используете изображение с очень высоким разрешением и загрузить его непосредственно в памяти , и, следовательно, String для base64 слишком велика. Всегда загружайте субсэмплированную версию изображения в память, чтобы избежать OutOfMemoryError. Take a look at this. Из документов:

For example, it’s not worth loading a 1024x768 pixel image into memory if it will eventually be displayed in a 128x96 pixel thumbnail in an ImageView.

первых расчет размера выборки для изображения:

public static int calculateInSampleSize(
     BitmapFactory.Options options, int reqWidth, int reqHeight) { 
// Raw height and width of image 
final int height = options.outHeight; 
final int width = options.outWidth; 
int inSampleSize = 1; 

if (height > reqHeight || width > reqWidth) { 

    final int halfHeight = height/2; 
    final int halfWidth = width/2; 

    // Calculate the largest inSampleSize value that is a power of 2 and keeps both 
    // height and width larger than the requested height and width. 
    while ((halfHeight/inSampleSize) >= reqHeight 
      && (halfWidth/inSampleSize) >= reqWidth) { 
     inSampleSize *= 2; 
    } 
} 

return inSampleSize; 
} 

Затем декодировать отобранную версию:

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, 
    int reqWidth, int reqHeight) { 

// First decode with inJustDecodeBounds=true to check dimensions 
final BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inJustDecodeBounds = true; 
BitmapFactory.decodeResource(res, resId, options); 

// Calculate inSampleSize 
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 

// Decode bitmap with inSampleSize set 
options.inJustDecodeBounds = false; 
return BitmapFactory.decodeResource(res, resId, options); 
} 

После того, как выборка версия битового массива загрузите, затем преобразуйте растровое изображение в base64.

+0

Я уже пользовался вашим образцом, но все еще имею белое изображение. Вы знаете, почему это произошло? –