我正在尝试打开JPEG图像的远程Stream并将其转换为Bitmap对象:
BitmapFactory.decodeStream(
new URL("http://some.url.to/source/image.jpg")
.openStream());
解码器返回null,并在日志中收到以下消息:
DEBUG/skia(xxxx): --- decoder->decode returned false
注意:
1.内容长度不为零,内容类型为image/jpeg
2.当我在浏览器中打开URL时,我可以看到图像。
我在这里失踪的是什么?
请帮忙。感谢。
答案 0 :(得分:10)
android bug n°6066中提供的解决方案包括覆盖std FilterInputStream,然后将其发送到BitmapFactory。
static class FlushedInputStream extends FilterInputStream {
public FlushedInputStream(InputStream inputStream) {
super(inputStream);
}
@Override
public long skip(long n) throws IOException {
long totalBytesSkipped = 0L;
while (totalBytesSkipped < n) {
long bytesSkipped = in.skip(n - totalBytesSkipped);
if (bytesSkipped == 0L) {
int byteValue = read();
if (byteValue < 0) {
break; // we reached EOF
} else {
bytesSkipped = 1; // we read one byte
}
}
totalBytesSkipped += bytesSkipped;
}
return totalBytesSkipped;
}
}
然后使用decodeStream函数:
Bitmap bitmap = BitmapFactory.decodeStream(new FlushedInputStream(inputStream));
我发现的另一个解决方案是简单地给BitmapFactory一个BufferedInputStream:
Bitmap bitmap = BitmapFactory.decodeStream(new BufferedInputStream(inputStream));
这两种解决方案应该可以解决问题。
可以在错误报告评论中找到更多信息:android bug no.6066
答案 1 :(得分:3)
似乎流和android处理它的方式存在一些问题;这个bug report中的补丁现在解决了这个问题。
答案 2 :(得分:0)
对我来说,问题在于图像的颜色类型:您的图像是彩色= CYMK不是RGB
答案 3 :(得分:0)
我找到了一个库,可以打开Android SKIA失败的图像。它对某些用例来说很有用:
https://github.com/suckgamony/RapidDecoder
对我来说,它解决了这个问题,因为我没有一次加载很多图像,而且我加载的很多图像都有ICC配置文件。 我没有尝试将它与Picasso或Glide等常用库集成。