我正在尝试从扩展的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参数的意义是什么。。。
结果发现,从它接收的前1024个字节中,它无法检测到它是一个实际的图像。如果它没有检测到文件是一个真实的图像,它将不会对其余部分进行解码,因此只调用了一次read[]。