如何在不先读取整个图像的情况下就地缩放流式位图?

2024-02-09

我有一个图像密集型的 Android 应用程序。我目前正在使用Bitmap.createScaledBitmap() http://developer.android.com/reference/android/graphics/Bitmap.html#createScaledBitmap%28android.graphics.Bitmap,%20int,%20int,%20boolean%29将图像缩放至所需尺寸。但是,此方法要求内存中已有原始位图,该位图可能相当大。

如何缩放正在下载的位图,而不先将整个位图写入本地内存或文件系统?


此方法将从图像中读取标头信息以确定其大小,然后读取图像并将其缩放到所需的大小,而不为完整的原始大小图像分配内存。

它还使用BitmapFactory.Options.inPurgeable http://developer.android.com/intl/fr/reference/android/graphics/BitmapFactory.Options.html#inPurgeable,这似乎是一个记录很少但在使用大量位图时防止 OoM 异常的理想选择。更新:不再使用 inPurgeable,请参阅这张纸条 https://stackoverflow.com/questions/7068132/why-would-i-ever-not-use-bitmapfactorys-inpurgeable-option/7068403#7068403来自罗曼

它的工作原理是使用 BufferedInputStream 读取图像的标头信息,然后再通过 InputStream 读取整个图像。

/**
 * Read the image from the stream and create a bitmap scaled to the desired
 * size.  Resulting bitmap will be at least as large as the 
 * desired minimum specified dimensions and will keep the image proportions 
 * correct during scaling.
 */
protected Bitmap createScaledBitmapFromStream( InputStream s, int minimumDesiredBitmapWith, int minimumDesiredBitmapHeight ) {

    final BufferedInputStream is = new BufferedInputStream(s, 32*1024);
    try {
        final Options decodeBitmapOptions = new Options();
        // For further memory savings, you may want to consider using this option
        // decodeBitmapOptions.inPreferredConfig = Config.RGB_565; // Uses 2-bytes instead of default 4 per pixel

        if( minimumDesiredBitmapWidth >0 && minimumDesiredBitmapHeight >0 ) {
            final Options decodeBoundsOptions = new Options();
            decodeBoundsOptions.inJustDecodeBounds = true;
            is.mark(32*1024); // 32k is probably overkill, but 8k is insufficient for some jpgs
            BitmapFactory.decodeStream(is,null,decodeBoundsOptions);
            is.reset();

            final int originalWidth = decodeBoundsOptions.outWidth;
            final int originalHeight = decodeBoundsOptions.outHeight;

            // inSampleSize prefers multiples of 2, but we prefer to prioritize memory savings
            decodeBitmapOptions.inSampleSize= Math.max(1,Math.min(originalWidth / minimumDesiredBitmapWidth, originalHeight / minimumDesiredBitmapHeight));

        }

        return BitmapFactory.decodeStream(is,null,decodeBitmapOptions);

    } catch( IOException e ) {
        throw new RuntimeException(e); // this shouldn't happen
    } finally {
        try {
            is.close();
        } catch( IOException ignored ) {}
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不先读取整个图像的情况下就地缩放流式位图? 的相关文章

随机推荐

  • appsettings.json 文件不在 .net core 控制台项目中

    据我所知 net core 已将 app config 文件替换为 appsetting json 然而 这个文件似乎只是为 ASP net 项目添加的 事实上 它甚至在添加项目列表中不可用 我发现this https blog bitsc
  • 如何检测工作站锁

    我正在开发一个应用程序 并试图检测工作站何时被锁定 例如用户按下 Windows L 键 我知道锁定事件具有价值 WTS SESSION LOCK 0x7 但我不知道如何使用它 我在网上搜索过但一无所获 您应该使用SystemEvents
  • Rails - 带条件的 text_field 类

    我想根据条件给出一个 text field 类 有没有办法在 Rails 中做到这一点 I e 仅当发生某种情况时 我才需要 必需 该类 使用三元 condition then else 操作员 阅读起来并不
  • VS 2015:性能向导中禁用分析工具

    我想对应用程序的性能进行采样 但在尝试使用性能向导启动新的分析会话时 各种工具 例如 CPU 使用率和应用程序时间轴 不可用 我使用的是 Visual Studio 2015 专业版 该应用程序使用 ASP NET 5 RC1 并从 Kes
  • 自定义 Json(反)序列化?

    我正在将一些代码从 Net 移植到 python 有时 我们需要将任意复杂的 json 从一种格式转换为另一种格式 Eg Query Boolean Operator And Parameters Equal Name Bob Boolea
  • 打印 RDLC 报告而不显示 ReportViewer 控件

    我想知道是否可以发送 打印数据DataGridView直接到 rdlc 报告而不将其绑定到ReportViewercontrol 有许多关于将 dgv 数据绑定到报告查看器控件的线程 我不想创建另一个带有报表查看器控件的表单 而是使用带有数
  • 具有默认值的 readline

    我可以使用以下命令将用户输入限制为 5 个字符GNU 阅读线 https cnswww cns cwru edu php chet readline rltop html include
  • Angular 2+ 错误:找不到名称“gapi”

    基本上 当我调用 google Analytics api 获取核心报告数据时 我收到以下错误 它可以在我的本地主机服务器上运行 但是当我尝试部署该应用程序时 它对我来说失败了 请告知如何在 angular2 中导入 gapi 变量 非常感
  • Angular:如何将字符串发送到注入服务?

    我创建了 CRUD 任务的通用服务 该服务通过 DI 依赖注入 使用 HttpClient 但我需要在服务的构造函数中通知另一个值 如何实现 因为当我在类的构造函数中定义将使用 DI 使用 CRUD 服务时 无法将参数传递给构造函数 下面是
  • 对数字中的数字求和的最快方法

    给定一个很大的数字 例如9223372036854775807 Int64 MaxValue 对数字求和的最快方法是什么 目前我正在 ToStringing 并将每个字符重新解析为int num ToString Sum c gt int
  • scala 解析器组合器 stackoverflow 递归

    以下代码示例在解析深度嵌套在括号中的表达式时由于堆栈溢出而崩溃 解析器组合器是标准库的一部分 有没有办法利用图书馆来避免这种情况 我不是在问它崩溃的原因 而是在问处理标准库的正确方法 解析 1 1 code import scala uti
  • 连接到另一个小部件的事件

    这很可能是一个重复的问题 但我必须问它 因为其他答案对我的情况没有帮助 因为我是 pyqt 的新手 几天前从 tkinter 切换过来 我想知道是否可以连接到这样的小部件的事件 self lineEdit QtGui QLineEdit s
  • 使用socket.io将数据从flash发送到node.js服务器

    我在node js中有一个简单的基于socket io的服务器 它监听端口81中的套接字 例如 我在用 Javascript 编写的客户端之间连接和传递数据没有问题 但经过多次尝试后 我无法让我的 Flash 应用程序连接到服务器并向其传递
  • Yii2 --- PHP 注意 'yii\base\ErrorException' 并显示消息 'unserialize(): 偏移量 8189 of 8192 字节时出错'

    PHP Notice yii base ErrorException with message unserialize Error at offset 8189 of 8192 bytes in C xampp htdocs final a
  • ImageView 中带圆角的位图

    我有一个 ImageView 我想用它来制作它rounded corners 我用这个
  • 如何在我们的应用程序中打开短信设置Activity?

    在下面的代码中我只能打开撰写短信 我想在不按下选项菜单的情况下打开短信设置活动 String SMS MIME TYPE vnd android dir mms sms Intent defineIntent new Intent Inte
  • WPF 中的多语言[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 您能推荐一种为 WPF 应用程序实现多语言系统的好方法吗 我现在使用的方法涉及 XML 类和 xaml 扩展 它在大多数情况下工作得很
  • 如何在运行时向 FireMonkey 的 TreeView 添加节点

    我在在线文档或 Delphi XE2 附带的演示中找不到任何示例 用于将节点添加到FMX TreeView TTreeView http docwiki embarcadero com Libraries XE2 en FMX TreeVi
  • WebLogic负载均衡

    我目前正在开发一个受 WebLogic 集群环境支持的项目 我已经成功设置了集群 但现在我想要一个负载平衡解决方案 目前 仅出于测试目的 我正在使用 WebLogic 的HttpClusterServlet with 循环赛负载均衡 是否有
  • 如何在不先读取整个图像的情况下就地缩放流式位图?

    我有一个图像密集型的 Android 应用程序 我目前正在使用Bitmap createScaledBitmap http developer android com reference android graphics Bitmap ht