`
522656914
  • 浏览: 7964 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SkImageDecoder::Factory returned null

阅读更多
最近在做大图片的加载,途中遇到这样一个问题:
图片在压缩文件中,我先用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方法就没这种问题了。
分享到:
评论
2 楼 benben_002 2014-03-25  
非常感谢
我换成BitmapFactory.decodeFile方法了,好用,在次感谢
1 楼 swerit 2013-12-19  
楼主,刚看到你的博文,不知道你这份源代码都哪个版本的,我这个版本是4.3的。我追溯到is.mark(1024); 实现的方法,发现其实什么都没有做,即:
/**
     * Sets a mark position in this InputStream. The parameter {@code readlimit}
     * indicates how many bytes can be read before the mark is invalidated.
     * Sending {@code reset()} will reposition the stream back to the marked
     * position provided {@code readLimit} has not been surpassed.
     * <p>
     * This default implementation does nothing and concrete subclasses must
     * provide their own implementation.
     *
     * @param readlimit
     *            the number of bytes that can be read from this stream before
     *            the mark is invalidated.
     * @see #markSupported()
     * @see #reset()
     */
    public void mark(int readlimit) {
        /* empty */
    }

相关推荐

    Android例子源码异步批量下载图片并缓存.zip

    1、下载大图decode时,可根据View大小自动缩放图片,不在出现OOM和SkImageDecoder::Factory returned null错误 2、图片下载失败时,可自定义失败重试次数 3、记录正在下载的任务,防止屏幕滚动时多次下载 4、缓存...

    异步批量下载图片并缓存源码.zip

    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、图片下载失败时,可...

    Android例子源码异步批量下载图片并缓存

    1、下载大图decode时,可根据View大小自动缩放图片,不在出现OOM和SkImageDecoder::Factory returned null错误 2、图片下载失败时,可自定义失败重试次数 3、记录正在下载的任务,防止屏幕滚动时多次下载 4、缓存...

    keepalived安装部署

    **Keepalived安装部署详解** Keepalived是一款开源的网络和服务监控软件,它主要用于实现Linux服务器间的负载均衡和高可用性。在系统集群中,Keepalived与Nginx、HAProxy等配合使用,可以确保当主服务器出现故障时...

    Linux6.4升级openssl1.1.1k和openssh至8.6.docx

    Linux升级OpenSSL 1.1.1k和OpenSSH 8.6 本文档详细介绍了如何升级Linux系统中的OpenSSL版本到1.1.1k和OpenSSH版本到8.6。升级这些组件可以提高系统的安全性和性能。 首先,需要拷贝并解压缩新的安装包openssl-...

    HttpClient 卡死 response 为 null - 帐前卒 - CSDN1

    然而,当`response`对象为`null`时,这可能表明以下几种情况: 1. **连接问题**:网络连接未建立或在请求过程中断开。检查网络配置,确保服务器地址正确且可访问。 2. **超时设置**:如果请求超时,`HttpClient`...

    Linux安装Redis实现过程及报错解决方案

    在Linux系统中安装Redis是一个常见的任务,特别是在搭建分布式缓存或数据存储环境时。本文将详细解析Redis的安装过程,并针对出现的错误提供解决方案。 首先,我们从Redis官方网站下载稳定版的Redis源码包,例如...

    物联网不能错过的Arduino(多个包文件).part6

    不能错过的Arduino图书.pdf Arduino一试就上手(第2版).pdf Arduino与树莓派哪个是更适合 - 推酷.pdf Arduino从基础到实践.pdf ARDUINO开发实战指南 AVR篇.pdf Arduino开源设计_吴义满.pdf ARDUINo玩转电子制作.pdf...

    phase_noise_estimate-master(phy)_NOISE_square4hr_channelestimati

    在通信系统中,相位噪声(Phase Noise)是影响信号质量的一个重要因素,尤其是在高精度、高速率的通信系统中。本项目"phase_noise_estimate-master(phy)_NOISE_square4hr_channelestimati"主要关注相位噪声的估计与...

    poolmon.exe

    此版本的工具可解决2008R2环境下报错 Poolmon: Query perf Failed (returned: c0000004)

    innodb存储引擎修改表共享空间为独立空间

    【MySQL InnoDB 存储引擎表空间转换】 在MySQL中,InnoDB存储引擎提供了两种表空间模式:共享表空间和独立表空间。共享表空间模式下,所有的InnoDB表数据和索引都存储在一个或多个文件中,而独立表空间模式则为每个...

    Android下通过root实现对system_server中binder的ioctl调用拦截

    Android下通过root实现对system_server中binder的ioctl调用拦截

    解决Java URL.openConnection().connect();报错:Server returned HTTP re

    声明 ... 概述: ...服务器理解请求方的请求,但是拒绝处理请求,通常是因为服务器上的文件设置权限导致的请求访问报错403。...报错Server returned HTTP response code 403 for URL.txt》里面的内容操作。

    LCTF软件备份VariSpec™ Liquid Crystal Tunable Filters

    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 ...

    error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 Request Entity Too Large

    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 Protocol Returned a Permanent Error 554 Relay access denied 错误,这是由于中继访问被拒绝所致。为了解决这个问题,我们需要了解 Domino 配置设置和 SMTP 协议的工作原理。 ...

    求救!!mybatis Expected one result (or null) to be returned by selectOne(), but found:18

    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...

    Datafactory实例

    - `If more than one record is returned, use first record`:如果查询返回了多条记录,则仅使用第一条记录的值。 - `Select a record at random`:如果查询返回了多条记录,则随机选择一条记录的值。 2. **通过...

    tessellate:三角形是我最喜欢的形状

    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

Global site tag (gtag.js) - Google Analytics