Skia 解码器无法解码远程流
Posted
技术标签:
【中文标题】Skia 解码器无法解码远程流【英文标题】:Skia Decoder fails to decode remote Stream 【发布时间】:2010-05-07 07:51:05 【问题描述】:我正在尝试打开 JPEG 图像的远程流并将其转换为位图对象:
BitmapFactory.decodeStream(
new URL("http://some.url.to/source/image.jpg")
.openStream());
解码器返回 null 并且在日志中我收到以下消息:
DEBUG/skia(xxxx): --- decoder->decode returned false
注意:
1.内容长度非零,内容类型为image/jpeg
2. 当我在浏览器中打开网址时,我可以看到图片。
我在这里缺少什么?
请帮忙。谢谢。
【问题讨论】:
你能提供一个链接到展示这种行为的图像吗? 不幸的是,我不能。我明白你在这里间接暗示什么...... :) 【参考方案1】: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));
我发现的另一个解决方案是简单地将 BufferedInputStream 提供给 BitmapFactory:
Bitmap bitmap = BitmapFactory.decodeStream(new BufferedInputStream(inputStream));
这两个解决方案应该可以解决问题。
更多信息可以在错误报告 cmets 中找到:android bug no.6066
【讨论】:
FWIW FlushedInputStream 方法对我有用; BufferedInputStream 没有。另外,“byte”是保留关键字,所以你应该把“int byte”改成“int byteValue”之类的。 这个解决方案对我有用,我认为这应该是正确的答案。 此错误仍未修复,变通办法并不总是有效。【参考方案2】:似乎流和 android 处理它的方式存在一些问题; bug report 中的补丁暂时解决了这个问题。
【讨论】:
【参考方案3】:对我来说,问题在于图像的颜色类型:您的图像是彩色的 = CYMK 而不是 RGB
【讨论】:
【参考方案4】:我找到了一个库,它可以打开 Android SKIA 失败的图像。它对某些用例很有用:
https://github.com/suckgamony/RapidDecoder
对我来说,它解决了这个问题,因为我没有一次加载很多图像,而且我加载的很多图像都有 ICC 配置文件。 我还没有尝试将它与 Picasso 或 Glide 等一些常用库集成。
【讨论】:
以上是关于Skia 解码器无法解码远程流的主要内容,如果未能解决你的问题,请参考以下文章
BitmapFactory.decodeStream 总是返回 null,skia 解码器显示解码返回 false