最近在做大图片的加载,途中遇到这样一个问题:
图片在压缩文件中,我先用BitmapFactory取图片尺寸,计算之后再按照合适尺寸取出Bitmap,代码如下:
//...
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(imgInputStream, null, options);
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
options.inJustDecodeBounds = false;
return BitmapFactory.decodeStream(imgInputStream, null, options);
//...
图片死活就是显示不出来,log中
SkImageDecoder::Factory returned null
网上搜索了好多篇文章,都说的含糊其辞,于是看了SDK源代码:
在BitmapFactory.decodeStream中
// we need mark/reset to work properly
if (!is.markSupported()) {
is = new BufferedInputStream(is, DECODE_BUFFER_SIZE);
}
// so we can call reset() if a given codec gives up after reading up to
// this many bytes. FIXME: need to find out from the codecs what this
// value should be.
is.mark(1024);
//...
于是看明白了,第一次取图片尺寸的时候is这个InputStream被使用过了,再真正取图片的时候又使用了这个InputStream,此时流的起始位置已经被移动过了,需要调用is.reset()来重置,然后再decodeStream(imgInputStream, null, options)就没问题了。
但是注意一个问题,is.mark(1024)是SDK中写死的,如果图片的大小超过1024字节,第一次decode取尺寸之后调用is.reset()会抛出IOException,所以建议使用BitmapFactory的其他decode方法,如果是网络读过来的流,最好在本地存成文件缓存,然后通过decodeFileDescriptor方法就没这种问题了。
分享到:
相关推荐
1、下载大图decode时,可根据View大小自动缩放图片,不在出现OOM和SkImageDecoder::Factory returned null错误 2、图片下载失败时,可自定义失败重试次数 3、记录正在下载的任务,防止屏幕滚动时多次下载 4、缓存...
1、下载大图decode时,可根据View大小自动缩放图片,不在出现OOM和SkImageDecoder::Factory returned null错误 2、图片下载失败时,可自定义失败重试次数 3、记录正在下载的任务,防止屏幕滚动时多次下载 4、缓存...
本项目是一个批量下载图片的小例子,项目编码UTF-8编译版本4.4.2主要特点有:1、下载大图decode时,可根据View大小自动缩放图片,不在出现OOM和SkImageDecoder::Factory returned null错误2、图片下载失败时,可...
1、下载大图decode时,可根据View大小自动缩放图片,不在出现OOM和SkImageDecoder::Factory returned null错误 2、图片下载失败时,可自定义失败重试次数 3、记录正在下载的任务,防止屏幕滚动时多次下载 4、缓存...
**Keepalived安装部署详解** Keepalived是一款开源的网络和服务监控软件,它主要用于实现Linux服务器间的负载均衡和高可用性。在系统集群中,Keepalived与Nginx、HAProxy等配合使用,可以确保当主服务器出现故障时...
Linux升级OpenSSL 1.1.1k和OpenSSH 8.6 本文档详细介绍了如何升级Linux系统中的OpenSSL版本到1.1.1k和OpenSSH版本到8.6。升级这些组件可以提高系统的安全性和性能。 首先,需要拷贝并解压缩新的安装包openssl-...
然而,当`response`对象为`null`时,这可能表明以下几种情况: 1. **连接问题**:网络连接未建立或在请求过程中断开。检查网络配置,确保服务器地址正确且可访问。 2. **超时设置**:如果请求超时,`HttpClient`...
在Linux系统中安装Redis是一个常见的任务,特别是在搭建分布式缓存或数据存储环境时。本文将详细解析Redis的安装过程,并针对出现的错误提供解决方案。 首先,我们从Redis官方网站下载稳定版的Redis源码包,例如...
不能错过的Arduino图书.pdf Arduino一试就上手(第2版).pdf Arduino与树莓派哪个是更适合 - 推酷.pdf Arduino从基础到实践.pdf ARDUINO开发实战指南 AVR篇.pdf Arduino开源设计_吴义满.pdf ARDUINo玩转电子制作.pdf...
在通信系统中,相位噪声(Phase Noise)是影响信号质量的一个重要因素,尤其是在高精度、高速率的通信系统中。本项目"phase_noise_estimate-master(phy)_NOISE_square4hr_channelestimati"主要关注相位噪声的估计与...
此版本的工具可解决2008R2环境下报错 Poolmon: Query perf Failed (returned: c0000004)
【MySQL InnoDB 存储引擎表空间转换】 在MySQL中,InnoDB存储引擎提供了两种表空间模式:共享表空间和独立表空间。共享表空间模式下,所有的InnoDB表数据和索引都存储在一个或多个文件中,而独立表空间模式则为每个...
Android下通过root实现对system_server中binder的ioctl调用拦截
声明 ... 概述: ...服务器理解请求方的请求,但是拒绝处理请求,通常是因为服务器上的文件设置权限导致的请求访问报错403。...报错Server returned HTTP response code 403 for URL.txt》里面的内容操作。
For latest information, or to determine how to alter the settings from the factory defaults, consult the VariSpec manual. Timing and latency The VariSpec filter takes a finite time to process ...
git首次提交代码到远程仓库提示413错误,错误信息如下 git push --set-upstream origin master Enumerating objects: 153, done. ... HTTP 413 curl 22 The requested URL returned error: 413 Req
Domino 发外网邮件时可能会出现 SMTP Protocol Returned a Permanent Error 554 Relay access denied 错误,这是由于中继访问被拒绝所致。为了解决这个问题,我们需要了解 Domino 配置设置和 SMTP 协议的工作原理。 ...
Expected one result (or null) to be returned by selectOne(), but found:18 下面展示一些 mapper.xml。 SELECT st.title as titlest ,st.info_text as info_text , sbt.title as titlesbt,sbt.icon as icon...
- `If more than one record is returned, use first record`:如果查询返回了多条记录,则仅使用第一条记录的值。 - `Select a record at random`:如果查询返回了多条记录,则随机选择一条记录的值。 2. **通过...
width (optional): width of canvas returned, defaults to window.innerWidth height (optional): height of canvas returned, defaults to window.innerHeight randomColor (optional): function that re