我正在使用 webview.capturePicture()
创建一个包含网页所有绘图对象的Picture对象。
我可以使用 canvas.drawPicture(picture, dst)
成功将此Picture对象渲染为位图,没有任何问题。
但是当我使用 picture.writeToStream(fos)
将图片对象序列化为文件时,然后
Picture.createFromStream(fis)
重新读取数据并创建一个新的图片对象,如上所示渲染的结果位图缺少任何更大的图像(任何超过20KB的东西!通过观察)。
这发生在我测试过的所有Android操作系统平台上,1.5,1.6和2.1。
查看 Skia
的本机代码,它是底层的Android图形库,以及从 picture.writeToStream()
生成的输出文件,我可以看到该文件的方式格式是构造的。
我可以看到这个Skia假脱机文件中的一些图像没有被写出(较大的那些),看似问题的代码在 skBitmap.cpp
中的方法< / p>
void SkBitmap::flatten(SkFlattenableWriteBuffer& buffer) const;
它写出位图 fWidth, fHeight, fRowBytes, FConfig and isOpaque
值,但只写出 SERIALIZE_PIXELTYPE_NONE (0).
这意味着假脱机文件不包含任何像素信息关于实际图像,因此无法正确恢复图片对象。
实际上,这会使 writeToStream and createFromStream()
API无法使用,因为它们无法可靠地存储和重新创建图片数据。
有没有人看到过这种行为,如果是这样,我是否错误地使用了API,是否可以解决,是否有解释,即不完整的API /错误,如果有的话,是否有任何计划在未来的Android版本中修复?
提前致谢。
答案 0 :(得分:3)
这就是API的工作方式。它从来没有用于长期存储,而是在当前流程中存储扁平化,或发送到另一个流程。你所要求的将不受支持。
答案 1 :(得分:0)
在Honeycomb平台上,似乎writeToStream()和createFromStream()现在存储并重新创建包含大图像数据的Picture对象。
然而,它确实带有以下警告:
WebView“do”创建的图片包含符合此条件的合适图像,因此可以序列化和恢复。
我还没有确认冰淇淋三明治也有效,但我假设/希望它会。