iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何解决Android中图片处理避免出现oom的问题
  • 338
分享到

如何解决Android中图片处理避免出现oom的问题

androidoom 2023-05-30 20:05:15 338人浏览 独家记忆
摘要

这篇文章主要介绍如何解决Android中图片处理避免出现oom的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. 通过设置采样率压缩res资源图片压缩 decodeResource  pub

这篇文章主要介绍如何解决Android中图片处理避免出现oom的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

1. 通过设置采样率压缩

res资源图片压缩 decodeResource

  public Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) {    // First decode with inJustDecodeBounds=true to check dimensions    final BitmapFactory.Options options = new BitmapFactory.Options();    options.inJustDecodeBounds = true;    BitmapFactory.decodeResource(res, resId, options);    // Calculate inSampleSize    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);    // Decode bitmap with inSampleSize set    options.inJustDecodeBounds = false;    return BitmapFactory.decodeResource(res, resId, options);  }

uri图片压缩 decodeStream

  public Bitmap decodeSampledBitmapFromUri(Uri uri, int reqWidth, int reqHeight) {    Bitmap bitmap = null;    try {    BitmapFactory.Options options = new BitmapFactory.Options();    options.inJustDecodeBounds = true;    BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, options);    options.inSampleSize = BitmapUtils.calculateInSampleSize(options,        UtilUnitConversion.dip2px(MyApplication.mContext, reqWidth), UtilUnitConversion.dip2px(MyApplication.mContext, reqHeight));    options.inJustDecodeBounds = false;    bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, options);    } catch (Exception e) {      e.printStackTrace();    }    return bitmap;  }

本地File url图片压缩

  public static Bitmap getloadlBitmap(String load_url, int width, int height) {    Bitmap bitmap = null;    if (!UtilText.isEmpty(load_url)) {      File file = new File(load_url);      if (file.exists()) {        FileInputStream fs = null;        try {          fs = new FileInputStream(file);        } catch (FileNotFoundException e) {          e.printStackTrace();        }        if (null != fs) {          try {            BitmapFactory.Options opts = new BitmapFactory.Options();            opts.inJustDecodeBounds = true;            BitmapFactory.decodeFileDescriptor(fs.getFD(), null, opts);            opts.inDither = false;            opts.inPurgeable = true;            opts.inInputShareable = true;            opts.inTempStorage = new byte[32 * 1024];            opts.inSampleSize = BitmapUtils.calculateInSampleSize(opts,                UtilUnitConversion.dip2px(MyApplication.mContext, width), UtilUnitConversion.dip2px(MyApplication.mContext, height));            opts.inJustDecodeBounds = false;            bitmap = BitmapFactory.decodeFileDescriptor(fs.getFD(),                null, opts);          } catch (IOException e) {            e.printStackTrace();          } finally {            if (null != fs) {              try {                fs.close();              } catch (IOException e) {                e.printStackTrace();              }            }          }        }      }    }    return bitmap;  }

根据显示的图片大小进行SampleSize的计算

public int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {    if (reqWidth == 0 || reqHeight == 0) {      return 1;    }    // Raw height and width of image    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;      // Calculate the largest inSampleSize value that is a power of 2 and      // keeps both height and width larger than the requested height and width.      while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth) {        inSampleSize *= 2;      }    }    return inSampleSize;  }

调用方式:

复制代码 代码如下:


mImageView.setImageBitmap(decodeSampledBitmapFromResource(getResources(), R.id.myImage, 100, 100))

Bitmap bitmap = decodeSampledBitmapFromUri(cropFileUri);
UtilBitmap.setImageBitmap(mContext, mImage,        UtilBitmap.getloadlBitmap(url, 100, 100),        R.drawable.ic_login_head, true);

2. 质量压缩:指定图片缩小到xkb以下

  // 压缩到100kb以下  int maxSize = 100 * 1024;  public static Bitmap getBitmapByte(Bitmap oriBitmap, int maxSize) {    ByteArrayOutputStream out = new ByteArrayOutputStream();    oriBitmap.compress(Bitmap.CompressFORMat.JPEG, 100, out);    byte[] fileBytes = out.toByteArray();    int be = (maxSize * 100) / fileBytes.length;    if (be > 100) {      be = 100;    }    out.reset();    oriBitmap.compress(Bitmap.CompressFormat.JPEG, be, out);    return oriBitmap;  }

3. 单纯获取图片宽高避免oom的办法

itmapFactory.Options这个类,有一个字段叫做 inJustDecodeBounds 。SDK中对这个成员的说明是这样的:
If set to true, the decoder will return null (no bitmap), but the out...

也就是说,如果我们把它设为true,那么BitmapFactory.decodeFile(String path, Options opt)并不会真的返回一个Bitmap给你,它仅仅会把它的宽,高取回来给你,这样就不会占用太多的内存,也就不会那么频繁的发生OOM了。

    public static BitmapFactory.Options decodeOptionsFromResource(Resources res, int resId) {    // First decode with inJustDecodeBounds=true to check dimensions    final BitmapFactory.Options options = new BitmapFactory.Options();    options.inJustDecodeBounds = true;    BitmapFactory.decodeResource(res, resId, options);    return options;  }

以上是“如何解决Android中图片处理避免出现oom的问题”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网精选频道!

--结束END--

本文标题: 如何解决Android中图片处理避免出现oom的问题

本文链接: https://www.lsjlt.com/news/221141.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何解决Android中图片处理避免出现oom的问题
    这篇文章主要介绍如何解决Android中图片处理避免出现oom的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. 通过设置采样率压缩res资源图片压缩 decodeResource  pub...
    99+
    2023-05-30
    android oom
  • 如何解决thinkphp5中图片处理遇到的问题
    这篇文章将为大家详细讲解有关如何解决thinkphp5中图片处理遇到的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。图片处理中遇到的问题我额外把图片的处理和上传封装成了一个类,返回保存的图片路径在图片...
    99+
    2023-06-15
  • 探讨如何在Vue中避免图片变形问题
    Vue是一种流行的JavaScript框架,它在开发现代Web应用程序方面非常有用。在Vue中添加图像是一个常见需求,但很多时候我们会遇到这样的问题:当图片尺寸与容器尺寸不同时,图片会变形。这篇文章将探讨如何在Vue中避免图片变形。为什么会...
    99+
    2023-05-14
  • PHP和NPM的路径管理:如何避免出现问题?
    在开发Web应用时,我们经常会使用PHP和NPM来管理项目依赖和路径。然而,这两种工具在路径管理方面存在一些问题,如果不加以注意,可能会导致一些不必要的错误和麻烦。本文将介绍如何避免这些问题,并提供一些示例代码来帮助您更好地理解。 一、P...
    99+
    2023-07-11
    npm unix path
  • 如何在Python中处理图片处理的问题
    如何在Python中处理图片处理的问题,需要具体代码示例在如今的数字化时代,图片已经成为人们日常生活中不可或缺的一部分。我们随时随地可以通过手机拍摄、下载网络上的图片。然而,有时我们需要对这些图片进行一些处理,如裁剪、缩放、滤镜等操作。本文...
    99+
    2023-10-22
    Python 图片处理
  • win7下使用PS处理图片时出现图片打不开问题的解决方法
    win7纯净版系统用户经常使用PhotoShop软件对图片进行处理,但是在处理图片的过程中经常遇到图片打不开的情况,使用Windows画图工具都可以正常打开图片的,图片都是从网上下载下来的。遇到这样情况该怎么办呢?下面小...
    99+
    2023-05-21
    ps打不开图片 ps图片处理错误 PS处理图片
  • 如何解决Android中Glide与CircleImageView加载圆形图片的问题
    这篇文章将为大家详细讲解有关如何解决Android中Glide与CircleImageView加载圆形图片的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 不使用占位符注释掉这两句代码即可。.pl...
    99+
    2023-05-30
    glide
  • 如何解决betterScroll在vue中存在图片时出现拉不动的问题
    这篇文章将为大家详细讲解有关如何解决betterScroll在vue中存在图片时出现拉不动的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.先写一个图片加载的方法c...
    99+
    2024-04-02
  • Java开发中,如何避免文件读写出现的常见问题?
    Java开发中,文件读写是常见的操作之一。然而,由于各种原因,文件读写可能会出现一些常见问题。这些问题可能会导致数据损坏,程序崩溃等严重后果。因此,在Java开发中,我们需要特别注意文件读写操作,并采取一些措施来避免常见问题的出现。 本文将...
    99+
    2023-09-12
    关键字 开发技术 文件
  • PHP中的缓存数组索引:如何避免出现常见问题?
    PHP是一种广泛使用的脚本语言,用于开发Web应用程序。在PHP中,缓存数组索引是一个常见的技术,它可以提高Web应用程序的性能。但是,如果不正确使用缓存数组索引,会出现一些常见的问题,例如内存泄漏和性能下降。因此,在使用缓存数组索引时,需...
    99+
    2023-08-06
    缓存 数组 索引
  • C++ 函数的递归实现:如何避免栈溢出问题?
    栈溢出是由于递归调用过多导致堆栈内存不足而发生的程序崩溃。避免栈溢出的一种方法是使用尾递归,即在函数的最后一个操作中进行递归调用。通过这种方式,可以消除堆栈帧的持续积累,防止栈溢出。示例...
    99+
    2024-04-22
    c++函数 递归实现 c++
  • vue中图片加载不出来的问题及解决
    目录一、项目打包完成后,打开整体空白1、路径问题原因解决办法2、vue-router的history模式打包后界面空白二、assets目录下图片加载不出来vue-cli的assets...
    99+
    2024-04-02
  • vue项目中图片懒加载时出现的问题及解决
    目录vue图片懒加载的问题vue图片懒加载实现步骤vue图片懒加载踩过的坑今天踩过的坑总结vue图片懒加载的问题 项目中遇到一个问题,记录一下,vue项目中前期没有做图片懒加载的时候...
    99+
    2024-04-02
  • 如何解决HTML+CSS布局img图片元素出现空白的问题
    这篇文章主要介绍如何解决HTML+CSS布局img图片元素出现空白的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、将图片转换为块级对象即,设置img为:display:block;在本例中添加一组CSS代码:...
    99+
    2023-06-27
  • 如何解决CentOS MAKE中出现的问题
    如何解决CentOS MAKE中出现的问题,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在CentOS MAKE的使用中会出现很多的问题,这次,我就碰到了CentOS MA...
    99+
    2023-06-16
  • 如何解决HTML5中图片之间缝隙的问题
    这篇文章给大家分享的是有关如何解决HTML5中图片之间缝隙的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在做h6的项目,碰到了一个百思不得其解的问题,几个img标签中间有大...
    99+
    2024-04-02
  • 如何解决在Android中使用setButtonDrawable()方法出现的兼容问题
    这篇文章给大家介绍如何解决在Android中使用setButtonDrawable()方法出现的兼容问题,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Android  setButtonDrawable()的...
    99+
    2023-05-31
    setbuttondrawable() android roi
  • NumPy和PHP:如何避免存储数据时出现的常见问题?
    数据存储是在计算机科学中非常重要的一部分。对于数据的存储,有许多常见的问题,其中包括数据丢失、数据损坏、数据泄露等。在本文中,我们将讨论如何使用NumPy和PHP避免这些常见问题。 NumPy是一种使用Python语言进行科学计算的库。它...
    99+
    2023-10-16
    存储 numy numpy
  • PHP 并发处理过程中如何避免日志重定向问题?
    PHP 作为一门强大的服务器端脚本语言,越来越多地被用于处理高并发的场景。在高并发处理过程中,日志记录是非常重要的,可以帮助我们排查问题和了解系统运行情况。但是,由于 PHP 本身的特性,很容易出现日志重定向的问题,导致我们无法正确地记录...
    99+
    2023-06-30
    并发 日志 重定向
  • 如何解决Android ScrollView下嵌套ListView或GridView出现的问题
    这篇文章主要为大家展示了“如何解决Android ScrollView下嵌套ListView或GridView出现的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决Android Sc...
    99+
    2023-05-30
    android scrollview
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作