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方法就没这种问题了。

时间: 2024-11-10 01:23:29

SkImageDecoder::Factory returned null的相关文章

android 下载图片出现SkImageDecoder::Factory returned null,BitmapFactory.Options压缩

网上有很多说是因为没有采用HttpClient造成的,尼玛,我改成了HttpClient 请求图片之后还是会出现SkImageDecoder::Factory returned null, 但是直接使用 bitmap = BitmapFactory.decodeStream(is);  是正常的,但解决不了图片大内存溢出的问题 解决办法: 重新获取一次流,注意看代码(红色部分): /** * 根据网络url获取bitmap对象 * @param url * @param width 要获取的宽度

王立平--AES加密图片实现 SkImageDecoder::Factory return null

这个问题是在加密图片,存入sd卡,在解密出来展示,出现的.我个人研究了非常久没解决.最后经过高人指点,最终攻克了. 在此,拿出来分享,希望各位少走弯路. 我之前的设计思路是:(能够不看哦) 1.把图片从drawable读入成bitmap 2.bitmap-->byte 3.调用AES的byte加密算法. 4.加密成byte,在转化为string 5,把string存入sd卡. -------------------------------- 4,从sd卡获取string. 5.string-->

Android中运行的错误:java.lang.UnsatisfiedLinkError: Couldn't load locSDK3: findLibrary returned null.

今天在使用百度地图的时候运行发现报错: 明明已经加入了liblocSDK3.so,但总是无法定位.提示错误java.lang.UnsatisfiedLinkError: Couldn't load locSDK3: findLibrary returned null. 网上找了很多的资料找到一个方法: 在libs下新建一个armeabi-v7a,然后将liblocSDK3.so复制一份到该文件夹" 如果这个不行,那么新建一个armeabi文件夹再放入liblocSDK3.so就可以了. Andr

异常: http://www.ly.com/news/visa.html: java.io.IOException: unzipBestEffort returned null

nutch 运行时异常: http://www.ly.com/news/visa.html: java.io.IOException: unzipBestEffort returned null 参考:http://www.tuicool.com/articles/faUB73 此页面采用这个是一个分段传输,而nutch爬虫则默认采用了非分段式处理,导致构造GZIP时出错,从而影响了后面的GZIP解压失败. 是否是分段传输可以在Http headers里面看到,如果是分段传输则有:transfe

java.lang.UnsatisfiedLinkError: Couldn't load locSDK3: findLibrary returned null.

java.lang.UnsatisfiedLinkError: Couldn't load audio_preprocessing from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.channel.economic-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.channel.economic-2, endorb, /sy

百度定位SDK错误:Couldn’t load locSDK3: findLibrary returned null

在使用百度定位SDK的时候,明明已经加入了liblocSDK3.so,Manifest中也添加了相应权限,注册了com.baidu.location.f服务.但总是无法定位.提示错误java.lang.UnsatisfiedLinkError: Couldn't load locSDK3: findLibrary returned null. 根据错误提示是无法找到locSDK3这个库,但是又明明在armeabi中加入了liblocSDK3.so.被这个问题困扰了很久.在做NDK开发的时候,ND

findlibrary returned null产生的联想,Android ndk开发打包时我们应该如何注意平台的兼容(x86,arm,arm-v7a)

很多朋友在开发Android JNI的的时候,会遇到findlibrary returned null的错误,因为某种原因,so没有打包到apk中.下面浅析下引起该错误的原因以及平台兼容性问题. 一.没有将so打包到apk中的原因. 当你发现到findlibrary returned null的错误时,其实最直接的解决办法就是解压apk,看看apk中的x86.armeabi.armeabi-v7a文件夹中是否有对应的so,此时你可能在对应的文件夹下发现少了so,然后再去查原因即可. 一般有两方面

android客户端加载网络大图片如何避免内存溢出

在Android开发中加载sdcard上的大图片到内存时容易导致OOM异常,常见的解决办法是基于BitmapFactory.Options类提供的方法定义指定的解码方式,设置inJustDecodeBounds属性为true,避免分配内存,返回一个null的Bitmap对象(包含outWidth,outHeightandoutMimeType),然后读取图片的尺寸和类型.再根据屏幕的高和宽对图片进行缩放,最后将缩放的图片加载到内存,主要代码如下: 1 Options opts = new Opt

Android异步批量下载图片并缓存

前言 本文引自:http://www.xycoding.com/articles/2014/07/29/android-async-images-download/,作者不详 ImagesDownLoad源码下载:DEMO 接触android开发不久,近段时间需实现一个批量下载图片并显示的小功能.在网上搜索了一圈,发现国内外网上异步加载的例子太多太杂,要么是加载大图decode时报OOM异常,要么内存急剧上升不稳定.所以在前辈们的基础上,做了一些优化,特共享出来,欢迎大家指正.这里主要参见了以下