首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Android中有没有什么有效的方法来缩小文件中的大图像并将其保存到新文件中,而不会出现OOM异常

在Android中,可以使用以下方法来缩小文件中的大图像并将其保存到新文件中,以避免出现OOM异常:

  1. 使用BitmapFactory.Options进行图片压缩:可以通过设置BitmapFactory.Options的inSampleSize属性来减小图片的尺寸,从而降低内存占用。inSampleSize表示缩放比例,设置为2表示将图片宽高缩小为原来的1/2。示例代码如下:
代码语言:txt
复制
public Bitmap decodeSampledBitmapFromFile(String filePath, int reqWidth, int reqHeight) {
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(filePath, options);

    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeFile(filePath, options);
}

private int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {
        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth) {
            inSampleSize *= 2;
        }
    }

    return inSampleSize;
}
  1. 使用Bitmap.compress()方法将Bitmap对象保存到文件:可以将压缩后的Bitmap对象保存到新文件中。示例代码如下:
代码语言:txt
复制
public void saveBitmapToFile(Bitmap bitmap, String filePath) {
    File file = new File(filePath);
    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(file);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 80, fos); // 压缩质量为80%
        fos.flush();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (fos != null) {
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

通过以上方法,可以在Android中有效地缩小文件中的大图像并将其保存到新文件中,避免OOM异常的发生。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云对象存储(COS):提供高可靠、低成本的云端存储服务,适用于存储和处理大规模非结构化数据。详情请参考:https://cloud.tencent.com/product/cos
  • 腾讯云图片处理(CI):提供图片处理和识别能力,包括图片缩放、裁剪、旋转、水印、格式转换等功能。详情请参考:https://cloud.tencent.com/product/ci
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

android 加载图片oom若干方案小结

相关知识介绍 1.颜色模型 常见的颜色模型有RGB、YUV、CMYK等,在大多数图像API中采用的都是RGB模型,Android也是如此;另外,在Android中还有包含透明度Alpha的颜色模型...当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。...有了上面的基础储备,我们来谈谈图片的oom解决方案: (1)缓存图像到内存,采用软引用缓存到内存,而不是在每次使用的时候都从新加载到内存; (2)调整图像大小,手机屏幕尺寸有限,分配给图像的显示区域本身就更小...) 场景演示 为了说明出现OOM的场景和解决OOM的方法,我们选取了两款不同的机型来做比较: (1)该应用展示一个gallery,该gallery只加载图片,gallery的adapter中传入图片的路径而不是图片对象本身...1-3张,之后便会出现OOM错误;在Defy上不会出现错误;原因是两者内存限制不同,Defy上运行的是第三方ROM,内存分配有40MB。

76780

融云技术分享:融云安卓端IM产品的网络链路保活技术实践

另外一种方式是利用安卓系统的定时任务管理器 AlarmManager 循环执行发送心跳包的任务。 这种方式不会因为系统休眠而失效,系统休眠后仍然可以通过 WakeLock 唤醒,执行心跳任务。...在链路不可用或者异常断开时,能及时探测并启动重连等保障机制。 基于以上特性,消息链路除了前面所说的心跳机制外,还另外维护了两套链路优化机制:复合连接机制和重连机制。...oom_adj 的值越低,代表重要度越高,比如 native 进程, framework 层启动的系统进程,优先级一般都为负数。其次是前台可见进程,系统也不会回收。...Linux 层启动,在安卓 5.0 之前,优先级会比较高,不会被杀。...在安卓 5.0 之后,该方式不再有效。

3K40
  • 腾讯技术分享:Android版手机QQ的缓存监控与优化实践

    实现图片缓存监控过程中我们主要遇到以下几个难点: 1)内存快照文件大,约300M左右: 内存文件过大会导致上传流量和存储成本比较大,而且上传耗时长。...可优化为缓存key,bitmap对象存到全局图片专用缓存中; 5)图片静态引用: 定义静态的Bitmap或者Drawable对象,进程周期内,对象所引用的资源都无法释放。...通过分析系统源码,我们发现ZipFile记录了安装包所有的类文件信息,手Q安装包中有超过15000个文件,文件越多,zipFile占用内存就越大。 ?...高内存用户是指当前可用内存不足20%的用户,是OOM高发用户群,降低这部分用户比例,可有效降低OOM率。 ?...的MMTLS详解》  《微信团队原创分享:Android版微信后台保活实战分享(进程保活篇)》  《微信团队原创分享:Android版微信后台保活实战分享(网络保活篇)》  《Android版微信从

    1.7K20

    android:persistent和android:priority的区别,对进程优先级有什么影响?

    关于Service保活和提高Android应用中Service组件优先级的方法,可以总结如下: 设置最高优先级:在AndroidManifest.xml文件中,通过设置android:priority...双进程守护(Android 5.0前有效):通过启动一个独立的守护进程与主进程相互监控和拉活。...像素Activity保活方案(不推荐):创建一个透明的1像素Activity,并设置为悬浮窗口,以维持应用的运行。...确实,通过将自己的应用作为系统应用(安装目录为/system/apk/),并设置android:persistent="true"属性,可以实现持久性,即应用会在系统启动时加载,并在异常出现时自动重新启动...因此,为了保证应用的可靠性和稳定性,通常还需要结合其他方法来实现Service保活和提高优先级的需求。

    1.8K10

    Bitmap 详解

    recycler 相关 在Android中,Bitmap的存储分为两部分,一部分是Bitmap的数据,一部分是Bitmap的引用。...在Android2.3时代,Bitmap的引用是放在堆中的,而Bitmap的数据部分是放在栈中的,需要用户调用recycle方法手动进行内存回收,而在Android2.3之后,整个Bitmap,包括数据和引用...  }     捕获异常,因为Bitmap耗内存,避免出现OOM被Crash掉 一定要对OutOfMemory异常进行捕获     Bitmap bitmap = null;       ...比如一个Activity会展示一些用户的头像列表,而如果用户没有设置头像的话,则会显示一个默认头像,而这个头像是位于应用程序本身的资源文件中的。如果有类似上面的场景,就可以对同一Bitmap进行缓存。...质量压缩是在保持像素的前提下改变图片的位深及透明度等,来达到压缩图片的目的,经过它压缩的图片文件大小(kb)会有改变,但是导入成bitmap后占得内存是不变的,宽高也不会改变。

    2.1K20

    Android常见面试题

    启动会就会调用一个checkStartActivityResult()方法,如果说没有在配置清单中配置有这个组件,就会在这个方法中抛出异常了。...Service,然后再将后启动的Service做stop处理 熟悉Android系统的童鞋都知道,系统出于体验和性能上的考虑,app在退到后台时系统并不会真正的kill掉这个进程,而是将其缓存起来。...属性动画:在Android3.0的时候才支持,通过不断的改变View的属性,不断的重绘而形成动画效果。相比于视图动画,View的属性是真正改变了。比如view的旋转,放大,缩小。...缓存构成了三级缓存, 优点: 图片存储在安卓系统的匿名共享内存, 而不是虚拟机的堆内存中, 图片的中间缓冲数据也存放在本地堆内存, 所以, 应用程序有更多的内存使用, 不会因为图片加载而导致oom,...使用这个项目,会导致项目对这个框架依赖非常的严重,一旦这个框架出现问题,那么对项目来说影响非常大的。

    1.2K10

    Android 内存优化总结&实践

    然而大部分的开发者观看下自己的异常上报系统,还是会发现各种内存问题仍然层出不穷,各种OOM为crash率贡献不少。...由此也衍生了很多进程保活的方法(提高优先级,互相唤醒,native保活等等),出现了国内各种全家桶,甚至各种杀不死的进程。...当然你可以去兑换5元,10元,而在Android系统里就没那么幸运了,系统会直接拒绝为你分配内存,并扔一个OOM给你(有人说Android系统并不会对Heap中空闲内存区域做碎片整理,待验证)。...platform-tools/hprof-conv.exe可以直接进行转换,用法:hprof-conv 原文件.hprof 新文件.hprof。...还有一些比较奇怪的情况,这里是我们扫描歌曲文件头的时候发生的,有些文件头居然有几百M大,导致一次申请了过大的内存,直接OOM,这里暂时也无法修复,直接catch住out of memory error。

    2K71

    Android面试题含答案「建议收藏」

    启动会就会调用一个checkStartActivityResult()方法,如果说没有在配置清单中配置有这个组件,就会在这个方法中抛出异常了。...Service,然后再将后启动的Service做stop处理 熟悉Android系统的童鞋都知道,系统出于体验和性能上的考虑,app在退到后台时系统并不会真正的kill掉这个进程,而是将其缓存起来。...属性动画:在Android3.0的时候才支持,通过不断的改变View的属性,不断的重绘而形成动画效果。相比于视图动画,View的属性是真正改变了。比如view的旋转,放大,缩小。...缓存构成了三级缓存, 优点: 图片存储在安卓系统的匿名共享内存, 而不是虚拟机的堆内存中, 图片的中间缓冲数据也存放在本地堆内存, 所以, 应用程序有更多的内存使用, 不会因为图片加载而导致oom,...使用这个项目,会导致项目对这个框架依赖非常的严重,一旦这个框架出现问题,那么对项目来说影响非常大的。

    1.4K20

    应用保活终极总结(二):Android6.0及以上的保活实践(进程防杀篇)

    原作者:“裂缝中的阳光dg”,本文现已重新修订并整理发布,感谢原作者的无私分享。...然后Android系统会根据当前系统资源和进程oom_adj值来回收相应的进程,前台进程一般不会被回收,空进程最容易被回收,这种管理规则就是"传说中"的Low Memory Killer。...另外,oom_adj值也会随着占用物理内存越大而增大,系统进程绝对不会被系统杀死。 接下来我将首先分析市面上的主流APP防杀方式,为我接下来的方案提供参考依据,请继续往下阅读。...其他如三星C9(Android 6.0)保活较好,特别是当一键清理时,"咕咚会自动启动,估计是使用了进程守护策略,而三星使用的是原生系统,因此结果你懂得;360F4(Android 6.0)保活很差,不愧是流氓中的战斗机...封装了很多通用操作窗口的方法...好了,不扯远了,既然我们已经知道Window对象在一个Activity中的位置,这里我们通过getWindow方法来获得SinglePixelActivity 的Window

    4.2K21

    APP的生死之道

    本身问题导致的进程回收,而第3种是系统行为,也是我们做APP保活可以做的地方。...所以这里有2个最直接相关的值: 内存阈值 oom_adj值 1、LMK之内存阈值 LMK是个多层次的内存回收器,它会根据内存的不同的阈值进行内存的回收,而具体的内存的的阈值是写在系统文件里的,位置在/sys...oom_adj值,oom_score_adj是一样的) 他们也是写入到文件里的,具体在/proc//下: /proc//oom_adj /proc//oom_score_adj...根据进程中当前活动组件的重要程度,Android会对进程的优先级进行评定,这个可以在ProcessList.java里可以看到,具体为(基于android 8.0): adj adj值 解释 UNKNOWN_ADJ...这样,即便在执行任务之前应用程序进程被杀,也不会导致任务不会执行,因为系统服务JobScheduler会使用bindServiceAsUser的方法把实现了JobService的子类服务启动起来,并执行它的

    1.3K31

    Android进程保活全攻略(上)

    android:persistent=“true” 代码实现(清单文件中配置): 保活程度:一般情况下不被杀,会被 force stop 杀死 android:name...可以监听的系统静态广播列表如下: 保活强度:我们可以发现,这个方法都是监听系统的一些广播,所以我们需要在我们的应用中注册静态广播,但是静态广播又会出现问题,那就是在4.0版本以上,没有启动过的应用或...保活强度: 该方案的局限性除与系统广播一样的因素外,主要受如下因素限制: 1) 反编译分析过的第三方应用的多少 2) 第三方应用的广播属于应用私有,当前版本中有效的广播,在后续版本随时就可能被移除或被改为不外发...文件中有个android:authorities属性。...最新 Android 版本(Android N)中系统好像对账户同步这里做了变动,该方法不再有效。

    1.2K50

    【Android开发高级系列】进程保活专题

    Android系统会根据当前系统资源和进程oom_adj值来回收相应的进程,前台进程一般不会被回收,空进程最容易被回收,这种管理规则就是"传说中"的Low Memory Killer。         ...另外,oom_adj值也会随着占用物理内存越大而增大,系统进程绝对不会被系统杀死。...保活强度:         该方案的局限性除与系统广播一样的因素外,主要受如下因素限制:     1) 反编译分析过的第三方应用的多少     2) 第三方应用的广播属于应用私有,当前版本中有效的广播,...:contentAuthority 指定要同步的ContentProvider在其AndroidManifest.xml文件中有个android:authorities属性。     ...最新 Android 版本(Android N)中系统好像对账户同步这里做了变动,该方法不再有效。

    67130

    Android面试大纲(集合)

    Service面试题 1、Service是什么 Service是四大组件之一,它可以在后台执行长时间运行操作而没有用户界面的应用组件 2、Service和Thread的区别 Service是安卓中系统的组件...(内存溢出),当前占用内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存限制就会抛出Out of memory异常 2、OOM相关概念 内存溢出:指程序在申请内存时,没有足够的空间供其使用 内存泄漏...,它提供get方法和put方法来获取缓存和添加缓存,其最重要的方法trimToSize是用来移除最少使用的缓存和使用最久的缓存,并添加最新的缓存到队列中 3、计算inSampleSize public...数组的最前面 ClassLoader会遍历dexElements数组,找到最前面的dex文件优先加载 24 进程保活面试题 1、进程的优先级 空进程 后台进程 服务进程 可见进程 前台进程 2、Android...进程回收策略 Low memory Killer(定时执行):通过一些比较复杂的评分机制,对进程进行打分,然后将分数高的进程判定为bad进程,杀死并释放内存 OOM_ODJ:判别进程的优先级 3、Android

    1.1K20

    android 减少图片出现oom错误

    在做Android图片程序的时候,由于图片比较多,很有很的机会出现OOM的机会,根据网上的资料做了些总结,期待能够减少OOM出现的机会。...1.使用底层的方法来替代使用java层的方法 尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图。   ...在读取时加上图片的Config参数,可以跟有效减少加载的内存,  通过使用这样的办法,能更有效阻止抛out of Memory异常 另外,decodeStream直接拿的图片来读取字节码了, 不会根据机器的各种分辨率来自动适应...优化虚拟机的堆内存使用 对于Android平台来说,其托管层使用的Dalvik Java VM从目前的表现来看还有很多地方可以优化处理,比如我们在开发一些大型游戏或耗资源的应用中可能考虑手动干涉GC处理...我们总不能将原始图片加载到内存中再进行缩放处理吧,要知道在移动开发中,内存是相当宝贵的,而且一张100K的图片,加载完所占用的内存何止100K?

    86160

    微信 Android 终端内存优化实践

    在解决各种问题的过程中,我们积累了一些相对有效和多面的优化手段及工具,从监控上报到开发阶段的测试检查,为预防和解决问题提供帮助,并还在不断的持续改进。...对有效解决问题的意义非常大。 ?...,在一些需要类似解码大图的场景下就会出现无法临时分配数十 MB 的内存供图片显示而导致 OOM,因此在 Monkey Test 时认为 Java Heap 占用超过 200 MB 即为异常。...在定位并解决这几个问题后,我们的 crash 系统和厂商的反馈中这种类型 OOM 确实降低了不少。所以监控线程数,收敛线程也成为我们降低 OOM 的有效手段之一。...从本地测试及灰度的结果上看,应用上该兜底策略,可以有效的减少用户出现 OOM 的情况,在灰度的 5w 用户中,有 3、4 个是命中了这个兜底策略,但具体兜底的策略是否合理,还需要经过更严格的测试才能确认上线

    13.5K01

    对Bitmap的内存优化

    在Android应用里,最耗费内存的就是图片资源。而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常。...如果发生了OutOfMemory异常,应用不会崩溃,而是得到了一个默认的Bitmap图。 经验分享:     很多开发者会习惯性的在代码中直接捕获Exception。...比如一个Activity会展示一些用户的头像列表,而如果用户没有设置头像的话,则会显示一个默认头像,而这个头像是位于应用程序本身的资源文件中的。...比如说,在开发网络应用过程中,可以将一些从网络上获取的数据保存到SD卡中,下次直接从SD卡读取,而不从网络中读取,从而节省网络流量。这种方式就是硬盘缓存。...如果不需要缩小,设置inSampleSize的值为1。如果需要缩小,则动态计算并设置inSampleSize的值,对图片进行缩小。

    1.4K50

    Bitmap图片压缩,大图加载防止OOM

    load-bitmap) 这两篇文章中已经做了很明确指出了如何高效的加载大图。...先看一些基础知识(后面有答案) Android官网-提供备用位图 这篇文章链接中的有讲到: 要在像素密度不同的设备上提供良好的图形质量,您应该以相应的分辨率在应用中提供每个位图的多个版本(针对每个密度级别提供一个版本...否则,Android 系统必须缩放位图,使其在每个屏幕上占据相同的可见空间,从而导致缩放失真,如模糊。...例如,如果 1024x768 像素的图片最终会在 ImageView 中显示为 128x96 像素缩略图,则不值得将其加载到内存中。...mRect 的宽高不能太大,否则加载得到的 Bitmap 的时候也会出现 OOM 的异常。

    2.8K00

    Android的bitmap和优化

    而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有    8M,如果超出了,就会出现OutOfMemory异常。...一般来说,如果能够获得Bitmap对象的引用,就需要及时的调用Bitmap的recycle()方法来释放Bitmap占用的内存空间,而不要等Android系统来进行释放。...这里所说的缓存有两个级别,一个是硬盘缓存,一个是内存缓存。比如说,在开发网络应用过程中,可以将一些从网络上获取的数据保存到SD卡中,下次直接从SD卡读取,而不从网络中读取,从而节省网络流量。...如果不需要缩小,设置inSampleSize的值为1。如果需要缩小,则动态计算并设置inSampleSize的值,对图片进行缩小。...也不会被销毁,因此就出现了内存泄露的问题。

    57010

    深入探索 Android 内存优化(炼狱级别-上)

    那是因为放在 内存 中,展示会更 “快”,快的原因有两点,如下所示: 1)、硬件快:内存本身读取、存入速度快。 2)、复用快:解码成果有效保存,复用时,直接使用解码后对象,而不是再做一次图像解码。...此外,除了因内存泄漏累积到一定程度导致OOM的情况以外,也有一次性申请很多内存,比如说 一次创建大的数组或者是载入大的文件如图片的时候会导致OOM。...而且,实际情况下 很多OOM就是因图片处理不当 而产生的。 二、常见工具选择 在 Android性能优化之内存优化中我们已经介绍过了相关的优化工具,这里再简单回顾一下。...5、线下大图片检测 在开发过程中,如果检测到不合规的图片使用(如图片宽度超过View的宽度甚至屏幕宽度),应该立刻提示图片所在的Activity和堆栈,让开发人员更快发现并解决问题。...9、设置内存兜底策略 设置内存兜底策略的目的,是为了 在用户无感知的情况下,在接近触发系统异常前,选择合适的场景杀死进程并将其重启,从而使得应用内存占用回到正常情况。

    1.4K31

    Bitmap图片压缩,大图加载防止OOM

    在这里插入图片描述 前言 Android官网中处理位图 和 高效加载大型位图 这两篇文章中已经做了很明确指出了如何高效的加载大图。...先看一些基础知识(后面有答案) Android官网-提供备用位图 这篇文章链接中的有讲到: 要在像素密度不同的设备上提供良好的图形质量,您应该以相应的分辨率在应用中提供每个位图的多个版本(针对每个密度级别提供一个版本...否则,Android 系统必须缩放位图,使其在每个屏幕上占据相同的可见空间,从而导致缩放失真,如模糊。 ?...例如,如果 1024x768 像素的图片最终会在 ImageView 中显示为 128x96 像素缩略图,则不值得将其加载到内存中。...mRect 的宽高不能太大,否则加载得到的 Bitmap 的时候也会出现 OOM 的异常。

    2K20
    领券