我们需要对从 InputStream 接收到的图像进行下采样。它是从某个 URL 接收到的图像,它可以非常小或非常大。为了将此图像放入内存,我们必须对其进行下采样。首先,我们借助 inJustDecodeBounds
检索图像大小并计算必要的样本。然后,我们通过在 BitmapFactory.Options.inSampleSize
中指定此示例来创建下采样位图。这个两步解码需要调用两次 decodeStream()
并且工作正常。
这对 SD 卡中的文件非常有效。但在我们的例子中,输入流不能被重置,所以我们不能调用 decodeStream()
两次。克隆输入流也不是一种选择,因为它的大小很大。或者,我们可以对同一个 URL 创建 2 个 HTTP 请求:首先获取图像大小,然后通过下采样解码实际图像,但这种解决方案似乎相当丑陋。
我们可以重用无法重置的流吗?或者请针对此问题提出一些已知的解决方法。
最佳答案
如果您不想重用流,显然必须将其保存到 RAM 或 SD 卡中,因为网络 InputStream(假设它没有缓冲)不会保留下载的数据。
因此,如前所述,解决此问题的方法是将图像直接保存到 SD 卡(可能在某些 temp 目录中),如果图像真的很大的话。
关于Android 在 BitmapFactory.decodeStream() 中重用流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13418081/