`
ynky1026
  • 浏览: 5841 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

android大图片转bitmap时造成内存溢出的一种解决方案

 
阅读更多
在将大图片转成bitmap时造成的内存溢出问题显然无法通过recycle(),软引用等方式来解决(才一个bitmap就溢出了)
  比较简单的折中方案就是采用BitmapFactory的内部类 Options来对图片进行压缩
 
  查阅源码javadoc Options类的公共属性inJustDecodeBounds的注释如下
        /**
         * If set to true, the decoder will return null (no bitmap), but
         * the out... fields will still be set, allowing the caller to query
         * the bitmap without having to allocate the memory for its pixels.
         */
明显 如果这个属性设置为true时 此时decode出来的bitmap是不予分配内存的 但是却可以取到bitmap的长宽
这时采用适当的比例对此长宽进行压缩 既可以将大图片转为bitmap在程序中显示

如下代码
                Options opts = new Options();
opts.inJustDecodeBounds = true;
String path = bmFile.getAbsolutePath();
BitmapFactory.decodeFile(path, opts);

int inSampleSize = (int) Math.ceil(Math.sqrt(opts.outWidth
* opts.outHeight / (width * height)));

opts.inJustDecodeBounds = false;
opts.inSampleSize =inSampleSize;
Log.d(TAG, "inSampleSize is" + inSampleSize);
Bitmap comBm = BitmapFactory.decodeFile(path, opts);
根据具体需求 只要 inSampleSize计算合理 完全可以最大限度保存图片质量

另外注意inSampleSize这个属性的javadoc
         Note: the decoder will try to fulfill this request, but the resulting bitmap
         may have different dimensions that precisely what has been requested.
         Also, powers of 2 are often faster/easier for the decoder to honor.
就是说 返回的图片尺寸未必与你要求的是一样的 而且取值为2的整数次幂是比较好的

关于 inSampleSize的算法 android.media包下ThumbnailUtils类提供2个算法 computeSampleSize和computeInitialSampleSize函数供android内部压缩图片时使用 坑爹的是这2个均为private方法 computeSampleSize会调用computeInitialSampleSize 最终返回一个Int值作为
inSampleSize使用 同时 该类中提供的createImageThumbnail压缩bitmap方法虽然为公共方法却神奇的不能调用(android坑爹的@hide注解) so 如果想使用这个算法 只有将2个函数copy到自己的代码中使用 否则可以根据要自己实现一个算法
   下边是自己实现的一个简单算法 根据想要的宽高与实际宽高对比 算出缩放的倍数 然后取与这个倍数最接近的2的整数次幂进行缩放 较大程度上保证与要求的目标宽高接近(在我的项目中使用实际和android算法提供的效果差不多)
      /**
* 取最接近参数的2的整数次幂
*
* @param inSampleSize
* @return
*/
private static int computeSampleSize(int inSampleSize) {
// 每次除2的商
int result = inSampleSize;
// 每次除以2的余数
int remainder = 0;
// 计数器
int i = 0;
// 参数是否就是2的整数次幂
boolean flag = true;
// 循环除以2 直到商为1时
while (result != 1) {
remainder = inSampleSize % 2;
if (remainder != 0) {
flag = false;
}
result = result / 2;
i++;
}
if (flag) {// 所有余数都为0 则参数即是2的整数次幂
return inSampleSize;
}
//取最接近的2的整数次幂
int outSampleSize = (int) (Math.abs(Math.pow(2, i) - inSampleSize) > Math
.abs(Math.pow(2, i + 1) - inSampleSize) ? Math.pow(2, i + 1)
: Math.pow(2, i));
// int outSampleSize = ( int ) Math.pow(2, i + 1);

return outSampleSize;
}
分享到:
评论

相关推荐

    图片过大引起的内存溢出解决方案

    ### 图片过大引起的内存溢出解决方案 在Android开发过程中,我们经常会遇到因加载大尺寸图片而引发的`OutOfMemoryError`(内存溢出错误)。这种问题通常发生在使用`BitmapFactory`来加载图片时,尤其是在资源有限的...

    android 轻松避免内存溢出

    在Android开发中,内存管理是至关重要的,尤其是处理图片资源时,经常遇到内存溢出...本项目提供的工具类是对此问题的一种解决方案,对于Android开发者来说,理解和应用这些方法,可以显著提升应用的性能和稳定性。

    bitmap内存问题

    `Bitmap`作为占用内存较大的数据类型之一,往往是导致内存溢出的主要原因之一。 1. **图片加载方式**:如果直接将大尺寸的图片加载到内存中,而没有进行适当的压缩处理,很容易超出内存限制。 2. **重复创建Bitmap...

    Android View转成Bitmap

    在Android开发中,将View转换为Bitmap是一种常见的需求,尤其在实现屏幕截图、保存或分享View内容、创建自定义控件或动态生成图片等场景下。以下是对如何将Android View转换为Bitmap的深入解析,包括代码逻辑分析、...

    android图片瀑布流优化版,防止内存溢出

    本优化版的Android图片瀑布流解决方案就是针对这一问题进行改进,旨在提供一种高效且稳定的图片加载策略。 1. **内存管理优化** - **使用BitmapFactory.Options**:在加载图片时,通过`BitmapFactory.decodeStream...

    listview 内存溢出的简单解决方案

    本篇文章将深入探讨如何解决ListView中图片过多导致的内存溢出,并通过分析`testMemoryAdapter`这个例子来提供一种简单的解决方案。 首先,我们需要理解为什么ListView中的图片会引发内存溢出。Android系统为每个...

    Android 内存溢出的一些解决办法.doc

    首先,针对图像导致的内存溢出,一种常见的解决方案是使用`BitmapFactory.Options`类进行图片解码时的尺寸控制。例如,在创建`Bitmap`对象时,可以设置`inSampleSize`属性来缩小图片的尺寸,减少内存占用。`...

    Android图片压缩解决方案,解决图片加载过程中ANR现象

    在Android应用开发中,图片加载是常见的操作,但由于图片文件大小不一,如果处理不当,可能会导致内存溢出(OOM)或应用程序无响应(ANR)等问题。本解决方案旨在探讨如何有效压缩Android中的图片,避免ANR现象,...

    图片压缩节约内存

    常见的解决方案有使用 Glide、Picasso 等第三方库,它们内置了图片压缩和缓存机制,能高效地处理大量图片的加载和显示。 "gb编码"在这里可能指的是GBK编码,一种常用的汉字字符集,它在中国大陆的使用较为广泛。但...

    android图片转pdf示例代码

    在实际开发中,还需考虑性能优化,如使用异步处理避免阻塞UI线程,以及内存管理,防止大图片导致的内存溢出问题。此外,对于大量图片的转换,可能需要分批处理,或者采用流式处理以减少内存占用。 总之,Android...

    安卓Android源码——防止内存溢出浅析.zip

    - 控制Bitmap使用:使用BitmapFactory.Options来控制解码时的大小,避免加载过大图片导致内存溢出。 - 适当使用内存缓存:例如LruCache,它可以限制缓存大小,防止过度消耗内存。 - 使用异步操作:对于耗时操作,...

    Android加载网络图片与本地图片解决OOM问题

    一种常见的解决方案是使用第三方库,例如"Android-Universal-Image-Loader"。这个开源项目提供了一个强大的图片加载、缓存框架,能够有效地防止OOM并优化图片显示。 Android-Universal-Image-Loader库的核心功能...

    Android高级应用源码-加载本地图片,绝对不会出现OOM.zip

    总结来说,该压缩包提供了一种在Android应用中加载本地图片的高级解决方案,重点在于如何有效管理内存,避免因加载大图片而导致的内存溢出问题。通过对Bitmap的合理配置,使用高效的图片加载库,实施延迟加载,以及...

    android图片放大缩小(绝对好用)

    本篇文章将深入探讨Android平台下如何有效地对图片进行缩放操作,并提供一种绝对好用的解决方案。 首先,我们需要了解Android中处理图片的基础知识。在Android中,图片通常以Bitmap对象的形式存在。Bitmap是Android...

    博客资源:ViewPager加载大量图片oom解决方案demo

    "博客资源:ViewPager加载大量图片oom解决方案demo" 这个标题表明了这是一个关于解决在Android应用中使用ViewPager展示大量图片时出现内存溢出(Out Of Memory,简称OOM)问题的实例教程。ViewPager是Android SDK中...

    安卓Android源码——图片下载以及内存处理防OOM.rar

    一种常见的解决方案是使用异步加载库,如Picasso、Glide或Fresco,它们能够智能地缓存图片,减少内存使用,并在必要时进行图片压缩。这些库能自动处理图片尺寸调整,确保加载到内存中的图片大小适合屏幕显示,从而...

    android照片墙demo,解决多张照片产生的内存消耗问题过大的问题

    在Android开发中,创建一个照片墙(Photo Wall)通常意味着在一个界面中展示大量的图片,这可能会引发内存消耗过大的问题,导致应用性能下降甚至出现内存溢出(OOM)的情况。本示例项目“android照片墙demo”正是...

    Android应用源码之100种图片处理效果大全项目.rar

    《Android应用源码之100种图片处理效果大全项目》是一个非常实用的学习资源,它提供了丰富的图片处理技术实现,适合Android开发者深入理解和实践。在这个项目中,你可以找到各种图片处理技术的应用实例,涵盖了许多...

    安卓手绘图片处理画板相关-android图片压缩终极方案.rar

    这个压缩包"安卓手绘图片处理画板相关-android图片压缩终极方案.rar"显然包含了关于优化和压缩Android应用程序中图片资源的解决方案。由于文件数量较多,我们无法逐一详述,但我们可以探讨一下Android图片压缩的通用...

Global site tag (gtag.js) - Google Analytics