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 解码器无法解码远程流的主要内容,如果未能解决你的问题,请参考以下文章

编译skia静态库时,图片解码库无法注册的问题

BitmapFactory.decodeStream 总是返回 null,skia 解码器显示解码返回 false

Xamarin 安卓。将字节数组转换为位图。 Skia 解码器返回 false

Android SKIA 图像解码

Skia图片解码模块流程分析

错误:读取 .tiff 文件时“编解码器无法使用提供的流类型”