如何在不出现内存不足异常的情况下获取相对于屏幕尺寸的缩放位图
How to get scaled bitmap with respect to screen size with out getting Out of memory exception
在我的 activity 中,我正在创建宽度和高度与设备分辨率(宽度和高度)相同的位图
我在做什么
Bitmap mBitmap = Bitmap.createBitmap(screenWidth, screenHeight,
Bitmap.Config.ARGB_8888);
并且 screenWidth 和 screenHeight 是
screenHeight = displaymetrics.heightPixels;
screenWidth = displaymetrics.widthPixels;
现在,如果我制作此位图,我的堆会增加到 19mb,这不太好。
那么告诉我两件事
1.什么是创建相对于屏幕和高度的位图的好方法,消耗的内存最少
2。使用后如何销毁位图?
请提供一点源代码或link的源代码。
在消耗最少内存的情况下创建相对于屏幕和高度的位图的好方法是什么?
- 永远不要用
screen height or width
创建 Bitmap
,因为根据 device.Instead 的 density
使用 height
和 width
的屏幕并计算 aspect ratio
。现在将 height
固定为一个常数值(如 1200px),然后根据 aspect ratio
计算 width
。 ImageView
或任何其他视图将正确缩放。
- 如果你真的想要透明度,那么使用
Bitmap.Config.ARGB_8888
,如果不需要,可以使用 RGB_565
或这里列表中的其他东西:http://developer.android.com/reference/android/graphics/Bitmap.Config.html
- 如果您不是创建新的
bitmap
而是从某些资源解码 bitmap
,请遵循以下几点:
- 您需要使用
BitmapFactory.Options.inSampleSize
来减少sampling
。那么如果你已经知道了高度和宽度,如何计算inSampleSize
呢?在这里参考:http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
- 所以你做了所有这些,但
inSampleSize
仍然不够高,你得到 OutOfMemoryError
?别担心,如果是这种情况,您需要 catch
这个 OutOfMemoryError
然后增加 inSampleSize
并再次进行位图解码。把这个逻辑放在一个循环中,所以崩溃永远不会发生。
位图使用后如何销毁?
- 这真的很简单。确保调用
Bitmap.recycle()
方法。并删除对位图的所有引用。执行此操作后,资源将被释放,GC 将进行清理。
更新: 当您使用 screen_width
和 screen_height
创建位图时,您最终会得到一个巨大的位图。而是创建适合整个屏幕的分辨率较低的位图。你可以看到下面的代码是如何做到的。
float screenHeight = displaymetrics.heightPixels;
float screenWidth = displaymetrics.widthPixels;
float aspectRatio = screenWidth/screenHeight;
int modifiedScreenHeight = 1000;
int modifiedScreenWidth = (int) (modifiedScreenHeight * aspectRatio);
Bitmap mBitmap = Bitmap.createBitmap(modifiedScreenWidth, modifiedScreenHeight, Bitmap.Config.ARGB_8888);
现在你得到了正确宽高比的位图。您可以使用 ImageView
中的位图来填充整个屏幕。确保为 ImageView
.
输入 android:scaleType="fitXY"
在我的 activity 中,我正在创建宽度和高度与设备分辨率(宽度和高度)相同的位图
我在做什么
Bitmap mBitmap = Bitmap.createBitmap(screenWidth, screenHeight, Bitmap.Config.ARGB_8888);
并且 screenWidth 和 screenHeight 是
screenHeight = displaymetrics.heightPixels;
screenWidth = displaymetrics.widthPixels;
现在,如果我制作此位图,我的堆会增加到 19mb,这不太好。
那么告诉我两件事
1.什么是创建相对于屏幕和高度的位图的好方法,消耗的内存最少
2。使用后如何销毁位图?
请提供一点源代码或link的源代码。
在消耗最少内存的情况下创建相对于屏幕和高度的位图的好方法是什么?
- 永远不要用
screen height or width
创建Bitmap
,因为根据 device.Instead 的density
使用height
和width
的屏幕并计算aspect ratio
。现在将height
固定为一个常数值(如 1200px),然后根据aspect ratio
计算width
。ImageView
或任何其他视图将正确缩放。 - 如果你真的想要透明度,那么使用
Bitmap.Config.ARGB_8888
,如果不需要,可以使用RGB_565
或这里列表中的其他东西:http://developer.android.com/reference/android/graphics/Bitmap.Config.html - 如果您不是创建新的
bitmap
而是从某些资源解码bitmap
,请遵循以下几点:- 您需要使用
BitmapFactory.Options.inSampleSize
来减少sampling
。那么如果你已经知道了高度和宽度,如何计算inSampleSize
呢?在这里参考:http://developer.android.com/training/displaying-bitmaps/load-bitmap.html - 所以你做了所有这些,但
inSampleSize
仍然不够高,你得到OutOfMemoryError
?别担心,如果是这种情况,您需要catch
这个OutOfMemoryError
然后增加inSampleSize
并再次进行位图解码。把这个逻辑放在一个循环中,所以崩溃永远不会发生。
- 您需要使用
- 永远不要用
位图使用后如何销毁?
- 这真的很简单。确保调用
Bitmap.recycle()
方法。并删除对位图的所有引用。执行此操作后,资源将被释放,GC 将进行清理。
- 这真的很简单。确保调用
更新: 当您使用 screen_width
和 screen_height
创建位图时,您最终会得到一个巨大的位图。而是创建适合整个屏幕的分辨率较低的位图。你可以看到下面的代码是如何做到的。
float screenHeight = displaymetrics.heightPixels;
float screenWidth = displaymetrics.widthPixels;
float aspectRatio = screenWidth/screenHeight;
int modifiedScreenHeight = 1000;
int modifiedScreenWidth = (int) (modifiedScreenHeight * aspectRatio);
Bitmap mBitmap = Bitmap.createBitmap(modifiedScreenWidth, modifiedScreenHeight, Bitmap.Config.ARGB_8888);
现在你得到了正确宽高比的位图。您可以使用 ImageView
中的位图来填充整个屏幕。确保为 ImageView
.
android:scaleType="fitXY"