问题描述
|
我不明白为什么用created0 than创建的位图要比用
BitmapFactory.decodeResource()
解码的位图要大(本机堆中的kB更大)。
我正在使用LG Optimus One(dpi为160,Android 2.2),并且使用Debug.getNativeHeapAllocatedSize()
测量分配的内存。
如果通过这种方式创建位图(200x200):
Bitmap createdBitmap = Bitmap.createBitmap(200,200,Config.ARGB_8888);
然后,本机堆的大小增加了c。 160kB。
但是,如果我从资源(来自文件夹drawable-mdpi
)中解码了PNG图片(200x200):
Bitmap mdpiBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.image_mdpi);
大小增加了c。只有3kB。
但是,如果我从drawable-ldpi
解码PNG图片(150x150),那么Android会将图片放大到200x200,原生堆的大小也会增加c。 160kB。
有人知道,为什么创建位图和解码(缩放)位图这么大?
感谢您的回答。
这是我用来衡量的代码:
long createdSizeStart = Debug.getNativeHeapAllocatedSize();
Bitmap createdBitmap = Bitmap.createBitmap(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
解决方法
BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled=false;
Bitmap bitmap;
bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.whatever,options);
不太清楚您的意图是什么...上面的代码段将创建一个Bitmap R.drawable。,无论它的实际大小是什么,没有缩放比例,其尺寸与创建资源时的尺寸相同。
希望这可以帮助。
,
\“有人知道,为什么创建位图并解码(缩放)位图这么大?”
160KB似乎对于200 * 200 * 4字节是正确的。您的问题应该是“为什么MDPI位图这么小?”。
我想知道以前是否已通过其他一些代码加载了MDPI版本,并且是否正在重用此数据。