Закодированное изображение byte64 вызывает OutOfMemoryError android - PullRequest
0 голосов
/ 21 декабря 2011

Я схожу с ума от этой проблемы:

Я получаю ошибку OutOfMemoryError каждый раз, когда открываю свое приложение. В какой-то момент он загружает изображение с сервера, но кодирует его строкой Base64.

То, что я делаю, в основном:

decodedString = Base64.decode(imagen_codificada);

 Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, 
                            decodedString.length); 

Но я получаю проклятый OOME каждый раз.

Если попытаться с этим:

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

Даже установка параметров на 128, что сумасшествие, но все равно вылетает ...

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

Я прикрепляю журнал ОШИБКИ:

12-21 10: 36: 27.032: E / dalvikvm-heap (5508): 10119168-байтовый внешний выделение слишком велико для этого процесса. 12-21 10: 36: 27.032: E / dalvikvm (5508): Недостаточно памяти: размер кучи = 5823 КБ, выделено = 4351 КБ, Размер растрового изображения = 720 КБ, предел = 13692 КБ 12-21 10: 36: 27,032: E / dalvikvm (5508): Информация об обрезке: занимаемая площадь = 6343 КБ, допустимая площадь = 6343 КБ, обрезка = 520 КБ 12-21 10: 36: 27.032: E / GraphicsJNI (5508): ВМ не позволяет выделять 10119168 байт 12-21 10: 36: 27,192: E / AndroidRuntime (5508): FATAL ИСКЛЮЧЕНИЕ: основное 12-21 10: 36: 27.192: E / AndroidRuntime (5508): java.lang.OutOfMemoryError: размер растрового изображения превышает бюджет виртуальной машины

РЕДАКТИРОВАТЬ: РЕШЕНО С ЭТОМ:

decodedString = Base64.decode(imagen_codificada);
                    System.gc();
                    BitmapFactory.Options options=new BitmapFactory.Options();
                    options.inSampleSize = 8;
                    InputStream input = new ByteArrayInputStream(decodedString);
                    Bitmap decodedByte = BitmapFactory.decodeStream(input, null, 
                            options); 
                    menu.setNombreApellido(decodedByte);

Спасибо всем !!

1 Ответ

1 голос
/ 21 декабря 2011

попробуйте
byte[] decodedString = (byte[])Base64.decode(imagen_codificada);
Это вернет битовый массив напрямую. Теперь вы можете использовать
BitmapFactory.Options options=new BitmapFactory.Options(); // options.inSampleSize = 8; уменьшить вашу фотографию.

...