Android:如何在不加载完整位图的情况下将流式图像即时渲染到 ImageView?

Posted

技术标签:

【中文标题】Android:如何在不加载完整位图的情况下将流式图像即时渲染到 ImageView?【英文标题】:Android: How to render a streaming image on-the-fly to ImageView without loading the complete bitmap? 【发布时间】:2013-06-15 17:43:45 【问题描述】:

我正在从要在 ImageView 中显示的 URL 加载图像。标准的方式是按如下方式创建位图(其中 InputStream is 已从 URL 获取):

Bitmap bm = BitmapFactory.decodeStream(is);

但是我正在处理大图像,并且我想在整个图像加载到位图中之前开始显示像素,即我想要实现图像的渐进式渲染(类似于在 Web 浏览器中加载大图像)。例如,如果图像是隔行扫描的 PNG,这将允许我在用户等待完整图像加载时向他们显示质量较低的图像。 基本上,我想实现如http://www.codinghorror.com/blog/2005/12/progressive-image-rendering.html所示的渲染

我知道我是否可以实现一个 PNG 解码器,或者使用一个开源实现,我可以修改它以在我阅读它们后立即将像素渲染到 ImageView 的位图,但这看起来像我想要的一个巨大的努力。

【问题讨论】:

【参考方案1】:

简单的渐进式接收渲染:这是通过考虑传输网络层 (TCP) 来实现的。每个按顺序接收的数据包都会在应用层中传递,并立即显示。如果您希望实现这一点,那么您需要考虑在您的应用程序中进行套接字编程。

但是,这是一种旧方法,实际上计算量更大。我个人更喜欢使用存根图像。存根映像在开始时显示,并启动具有 url 连接和下载(管理器或缓存)的即时线程。下载完成后,您将返回主线程以更新照片。这样更有条理。

如果我有任何错误,请纠正我。

【讨论】:

第一种方法的主要问题是图像数据不是直接像素,而是根据我使用的图像格式(例如 PNG)进行压缩和组织。即使我处理单个数据包,主要的工作还是在渲染之前将该数据转换为像素颜色值,这相当于为所述图像格式编写解码器(这将是一个矫枉过正)。我宁愿寻找一个更简单的现有方法/库。当然,您的第二种方法要容易得多。如果没有其他方法,我将其保留为我的备份选项:)【参考方案2】:

试试 Facebook 的 Freso 项目:http://frescolib.org/#streaming 我不确定它支持哪些文件格式,但它支持渐进式编码的 JPEG 的渐进式渲染。

【讨论】:

以上是关于Android:如何在不加载完整位图的情况下将流式图像即时渲染到 ImageView?的主要内容,如果未能解决你的问题,请参考以下文章

在不改变原始纵横比的情况下将位图大小调整为 512x512

如何在不先加载到 RAM 的情况下将文件加载到 blob 中?

如何在不创建架构的情况下将 CSV 文件加载到 BigQuery

如何在不删除源文件的情况下将数据从 HDFS 加载到配置单元?

如何在不创建通知的情况下将图标添加到 Android 状态栏?

如何在不重新加载页面的情况下将任意 JSON 发送到 node.js?