Почему растровое изображение больше, чем декодированное растровое изображение из ресурсов в Android? - PullRequest
0 голосов
/ 18 июня 2011

Я не понимаю, почему Bitmap создается с Bitmap.createBitmap() больше (больше кбайт в собственной куче), чем декодированный Bitmap с BitmapFactory.decodeResource().

Я работаю с LG Optimus One (dpi160, Android 2.2) и я измеряю выделенную память с помощью Debug.getNativeHeapAllocatedSize().

Если я создал растровое изображение (200x200) таким образом:

Bitmap createdBitmap = Bitmap.createBitmap(200, 200, Config.ARGB_8888);

Затем размер собственной кучи увеличилсяк. 160kB .

Но если я расшифровал изображение PNG (200x200) из ресурса (из папки drawable-mdpi):

Bitmap mdpiBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image_mdpi);

Размер увеличился на c. только 3 КБ .

Но если я декодирую PNG-изображение (150x150) с drawable-ldpi, то Android масштабирует изображение до 200x200, и размер собственной кучи также увеличивается на c. 160kB .

Кто-нибудь знает, почему создается растровое изображение и декодируется (масштабируется) такое большое изображение?

Спасибо за ответ.

Вот код, который я использовал для измерения:

long createdSizeStart = Debug.getNativeHeapAllocatedSize();
Bitmap createdBitmap = Bitmap.createBitmap(200, 200, Config.ARGB_8888);
long createdSize = Debug.getNativeHeapAllocatedSize() - createdSizeStart;

long resourceMdpiSizeStart = Debug.getNativeHeapAllocatedSize();
Bitmap resourceMdpiBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image_mdpi);
long resourceMdpiSize = Debug.getNativeHeapAllocatedSize() - resourceMdpiSizeStart;

long resourceLdpiSizeStart = Debug.getNativeHeapAllocatedSize();
Bitmap resourceLdpiBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image_ldpi);
long resourceLdpiSize = Debug.getNativeHeapAllocatedSize() - resourceLdpiSizeStart;

Log.i("test", "Created: " + createdSize + " B, " + createdBitmap.getWidth() + "x" + createdBitmap.getHeight());
Log.i("test", "Resource MDPI: " + resourceMdpiSize + " B, " + resourceMdpiBitmap.getWidth() + "x" + resourceMdpiBitmap.getHeight());
Log.i("test", "Resource LDPI: " + resourceLdpiSize + " B, " + resourceLdpiBitmap.getWidth() + "x" + resourceLdpiBitmap.getHeight());

Выход:
Создано: 163952 B, 200x200
Ресурс MDPI: 3184 B, 200x200
Ресурс LDPI: 164424 B, 200x200

Ответы [ 2 ]

3 голосов
/ 15 июля 2013
BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled=false;
Bitmap bitmap;
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.whatever, options);

Не слишком уверен, каковы ваши намерения ... Приведенный выше фрагмент кода создаст растровое изображение R.drawable. Независимо от фактического размера ... без масштабирования ... с такими же размерами, как было при созданииресурс.

Надеюсь, это поможет.

1 голос
/ 18 июня 2011

«Кто-нибудь знает, почему создается растровое изображение и расшифровывается (масштабируется) растровое изображение?»

160KB кажется правильным для 200 * 200 * 4 байта. Ваш вопрос должен быть «почему растровое изображение MDPI такое маленькое?».

Интересно, загружалась ли ранее версия MDPI каким-либо другим фрагментом кода, и эти данные используются повторно.

...