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 № 1Jest 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.