2010-08-19 19 views
6

Tôi đang sử dụng webview.capturePicture() để tạo đối tượng Ảnh chứa tất cả đối tượng bản vẽ cho trang web.Picture.writeToStream() không ghi ra tất cả các bitmap

Tôi có thể hiển thị thành công đối tượng Hình ảnh này vào bitmap bằng cách sử dụng canvas.drawPicture(picture, dst) mà không gặp vấn đề gì. Tuy nhiên khi tôi sử dụng picture.writeToStream(fos) để serialize các đối tượng hình ảnh ra tập tin, và sau đó Picture.createFromStream(fis) để đọc dữ liệu trở lại và tạo ra một đối tượng hình ảnh mới, bitmap kết quả khi trả lại như trên là mất tích bất kỳ hình ảnh lớn hơn (bất cứ điều gì hơn khoảng 20KB! theo quan sát).

Điều này xảy ra trên tất cả nền tảng hệ điều hành Android mà tôi đã thử nghiệm 1,5, 1,6 và 2,1. Xem mã gốc cho Skia thư viện đồ họa Android cơ bản và tệp đầu ra được tạo từ picture.writeToStream() Tôi có thể xem cách định dạng tệp được tạo. tôi có thể thấy rằng một số hình ảnh trong file đến máy in Skia này không được viết ra (những cái lớn hơn), mã mà dường như là vấn đề là ở skBitmap.cpp trong phương pháp

void SkBitmap::flatten(SkFlattenableWriteBuffer& buffer) const; 

Nó viết các giá trị bitmap fWidth, fHeight, fRowBytes, FConfig and isOpaque nhưng sau đó chỉ cần viết ra SERIALIZE_PIXELTYPE_NONE (0). Điều này có nghĩa là tệp spool không chứa bất kỳ thông tin pixel nào về hình ảnh thực tế và do đó không thể khôi phục đối tượng hình ảnh chính xác.

Điều này có hiệu quả làm cho các API writeToStream and createFromStream() vô dụng vì chúng không lưu trữ và tạo lại dữ liệu hình ảnh một cách đáng tin cậy.

Có ai khác nhìn thấy hành vi này và nếu tôi sử dụng API không chính xác, có thể làm việc xung quanh không, có giải thích tức là API/lỗi chưa hoàn chỉnh và nếu có kế hoạch sửa lỗi trong bản phát hành sau này Android?

Xin cảm ơn trước.

Trả lời

0

Trên nền tảng Honeycomb, có vẻ như writeToStream() và createFromStream() hiện lưu trữ và tạo lại đối tượng Hình ảnh bao gồm dữ liệu hình ảnh lớn.

Tuy nhiên nó không đi kèm với sự chú ý sau đây:

  • Các dữ liệu hình ảnh được sử dụng trong một bức tranh phải có một loại không thay đổi.
  • Dữ liệu hình ảnh phải được tạo bằng BitmapFactory.Options sau được đặt thành true, inInputShareable và inPurgeable. Điều này có thể được thực hiện bằng cách sử dụng BitmapFactory.decodeResource() đi qua trong BitmapFactory.Options.

Điều đó xảy ra là Ảnh được tạo bởi WebView 'do' chứa hình ảnh phù hợp đáp ứng tiêu chí này và do đó có thể được tuần tự hóa và khôi phục.

Tôi chưa xác nhận rằng Ice Cream Sandwich cũng hoạt động nhưng tôi giả định/hy vọng rằng nó sẽ.

+0

Tôi có thể xác nhận rằng Ice Cream Sandwich và JellyBean đang hoạt động chính xác, lưu và khôi phục hình ảnh trong đối tượng Picture. –

3

Đó là cách API có nghĩa là hoạt động. Nó không bao giờ được dự định để lưu trữ lâu dài, nhưng để lưu trữ phẳng trong quá trình hiện tại, hoặc để gửi đến một quá trình khác. Những gì bạn đang yêu cầu sẽ không được hỗ trợ.

+1

Cảm ơn bạn đã phản hồi, tuy nhiên vì hình ảnh/bitmap lớn hơn (trên 32KB) không được làm phẳng vào luồng nên không thể chuyển đối tượng Android Picture từ quy trình này sang quy trình khác. Đó là sự hiểu biết của tôi rằng cách chính xác để truyền dữ liệu giữa các quá trình là để tuần tự hóa dữ liệu, điều này là không thể với đối tượng Android Picture vì nó giảm các bitmap lớn hơn từ luồng phẳng. Nó cũng không khả thi để thực hiện phương thức tuần tự của riêng bạn cho các đối tượng Hình ảnh vì dữ liệu liên quan nằm trong mã gốc. Bạn có thể đề xuất phương pháp thay thế để đạt được điều này không. –

Các vấn đề liên quan