Внешнее распределение Android слишком велико, но почему? - PullRequest
1 голос
/ 21 сентября 2011

У меня есть большое изображение 1,28 МБ (1 343 488 байт), которое я использую в своем приложении, однако я хотел изменить несколько вещей и создал новое изображение размером всего 292 КБ (299 008 байт).Я создал оба изображения в Photoshop 7.0, сохранил их как .png и оба как чересстрочные.Я создавал это приложение вокруг большого изображения, и как только я переключаюсь на меньшее изображение, я получаю ошибку OutOfMemory с моим растровым изображением, говорящим

12108912-byte external allocation too large for this process

почему оно думаетмой новый образ 11,5 МБ?если я переключаю изображение обратно на более крупное, оно корректно компилируется.

private Bitmap loadMapBitmap() {
    Log.d("InteractiveMap", "loadBitmap");
    Bitmap bitmap = null;
    try {   
        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.map);
    } catch (Resources.NotFoundException e) {
        Log.d(TAG, "loadMapBitmap - " + e.toString());
        finish();
    } catch (OutOfMemoryError e) {
        Log.d("InteractiveMap", "too big " + e.getMessage());
        finish();
    }

    return bitmap;
}

Я не понимаю, почему изображение намного меньшего размера не работает.

1 Ответ

2 голосов
/ 21 сентября 2011

Это разрешение изображения.Размер файла не имеет значения.Когда вы загружаете растровое изображение в память, каждый пиксель занимает 4 байта при использовании ARGB8888 формата
(который является значением по умолчанию для BitmapFactory.decode..()).

Пример. Изображение размером 640x480 пикселей занимает 640*480*4 байт, что составляет 1200 КБ в памяти.Это полностью зависит от формата файла, используемого для сжатия этого изображения (PNG, JPEG, ..) и размера файла.

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

...