/ / Zewnętrzna alokacja Android zbyt duża, ale dlaczego? - android, nieobecność w pamięci

Zewnętrzna alokacja Androida jest zbyt duża, ale dlaczego? - android, nieobecność w pamięci

Mam duży obraz 1.28 MB (1 343 488 bajtów), których używam w mojej aplikacji, jednak chciałem zmienić kilka rzeczy i stworzyć nowy obraz, który miał tylko 292 KB (299,008 bajtów) rozmiaru. Stworzyłem oba obrazy w Photoshopie 7.0, zapisałem je jako .png i oba jako przeplot. Stworzyłem tę aplikację wokół większego obrazu, a gdy tylko przejdę do mniejszego obrazu, otrzymuję komunikat OutOfMemory z informacją o bitmapie

12108912-byte external allocation too large for this process

dlaczego moim zdaniem nowy obraz ma 11,5 MB? jeśli przełączę obrazy z powrotem na większe, kompiluje się poprawnie.

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;
}

Nie rozumiem, dlaczego znacznie mniejszy obraz nie działa.

Odpowiedzi:

2 dla odpowiedzi № 1

Jest to rozdzielczość obrazu.Nie rozmiar pliku nie ma znaczenia.Jeśli załadujesz mapę bitową do pamięci, każdy piksel zajmuje 4 bajty, gdy używasz ARGB8888 format
(który jest domyślny dla BitmapFactory.decode..()).

Przykład: zdjęcie o rozmiarze 640 x 480 pikseli 640*480*4 bajtów, co w pamięci wynosi 1200 KB. Jest to całkowicie niezależne od formatu pliku używanego do kompresji tego obrazu (PNG, JPEG, ..) i rozmiaru pliku.

W skrajnych przypadkach rozmiary te różnią się znacznie. Na przykład. tworzysz ogromny obraz, który składa się z jednego koloru. To bardzo dobrze, jeśli chodzi o kompresję plików, ale w pamięci zajmuje dużo miejsca.