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?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不先加载到 RAM 的情况下将文件加载到 blob 中?
如何在不创建架构的情况下将 CSV 文件加载到 BigQuery
如何在不删除源文件的情况下将数据从 HDFS 加载到配置单元?