为啥 SKIA 不使用自定义 FilterInputStream?

Posted

技术标签:

【中文标题】为啥 SKIA 不使用自定义 FilterInputStream?【英文标题】:Why does SKIA not use a custom FilterInputStream?为什么 SKIA 不使用自定义 FilterInputStream? 【发布时间】:2013-02-21 21:49:03 【问题描述】:

我正在尝试从扩展的 FilterInputStream 解码位图。我必须对图像数据执行动态字节操作以向 SKIA 提供可解码的图像,但是 SKIA 似乎忽略了我的自定义 InputStream 并初始化了它自己的一个...

当我运行我的测试应用程序时,尝试加载 2mb 大的 JPEG 会导致 ObfuscatedInputStream.read([]) 仅从 BitmapFactory.decodeStream() 调用一次

似乎一旦从我的ObfuscatedInputStream 检索到的前 16kb 数据确定文件类型,它就会初始化自己的本机流并从中读取,从而有效地呈现我对输入流应该如何工作所做的所有更改无用...

这是我扩展的 FilterInputStream 类中的缓冲读取函数。函数顶部的Log.d只执行一次。

@Override
public int read(byte b[], int off, int len) throws IOException 

    Log.d(TAG, "called read[] with aval + " + super.available() + " len " + len);
    int numBytesRead = -1;

    if (pos == 0)
    
        numBytesRead = fill(b);
        if (numBytesRead < len)
        
            int j;
            numBytesRead += ((j = super.read(b, numBytesRead, len - numBytesRead)) == -1) ? 0 : j ;
        
    
    else
        numBytesRead = super.read(b, 0, len);

    if (numBytesRead > -1)
        pos += numBytesRead;
    Log.d(TAG, "actually read " + numBytesRead);
    return numBytesRead;

有人遇到过这个问题吗?似乎获得我想要的行为的唯一方法是重写 SKIA 库的部分......我真的很想知道 InputStream 参数的意义是什么,如果本机实现初始化它自己的流......

【问题讨论】:

【参考方案1】:

原来它无法从它接收的前 1024 个字节中检测到它是一个实际图像。如果它没有检测到该文件是一个实际图像,它不会打扰解码其余的,因此只有读取[] 调用一次。

【讨论】:

以上是关于为啥 SKIA 不使用自定义 FilterInputStream?的主要内容,如果未能解决你的问题,请参考以下文章

为啥窗户上的skia效率低下

在Qt窗口中嵌入skia控件

为啥不推荐使用 JScript 在 WiX 中实现自定义操作?

为啥我的 UISearchDisplayController 不使用我的自定义 tableViewCell?

为啥自定义光标图像显示不正确?

为啥自定义 SwiftUI 视图不响应状态变化