Picture.writeToStream()没有写出所有位图

时间:2010-08-19 11:33:25

标签: java android image

我正在使用 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版本中修复?

提前致谢。

2 个答案:

答案 0 :(得分:3)

这就是API的工作方式。它从来没有用于长期存储,而是在当前流程中存储扁平化,或发送到另一个流程。你所要求的将不受支持。

答案 1 :(得分:0)

在Honeycomb平台上,似乎writeToStream()和createFromStream()现在存储并重新创建包含大图像数据的Picture对象。

然而,它确实带有以下警告:

  • 图片中使用的图像数据必须是不可变类型。
  • 必须使用以下BitmapFactory.Options设置为true,inInputShareable和inPurgeable创建图像数据。这可以通过使用BitmapFactory.decodeResource()传递BitmapFactory.Options来完成。

WebView“do”创建的图片包含符合此条件的合适图像,因此可以序列化和恢复。

我还没有确认冰淇淋三明治也有效,但我假设/希望它会。