Picture.writeToStream () не записывает все растровые изображения - PullRequest
6 голосов
/ 19 августа 2010

Я использую webview.capturePicture() для создания объекта Picture, который содержит все графические объекты для веб-страницы.

Я могу успешно отобразить этот объект Picture в растровое изображение, используя canvas.drawPicture(picture, dst) без проблем.Однако, когда я использую picture.writeToStream(fos) для сериализации объекта изображения в файл, а затем Picture.createFromStream(fis) для чтения данных обратно и создания нового объекта изображения, результирующее растровое изображение припри визуализации, как указано выше, отсутствуют изображения большего размера (что-то более 20 КБ! по наблюдениям).

Это происходит на всех платформах Android OS, которые я тестировал 1.5, 1.6 и 2.1.Глядя на собственный код для Skia, который является базовой графической библиотекой Android, и выходной файл, полученный из picture.writeToStream(), я могу видеть, как создается формат файла.Я вижу, что некоторые изображения в этом файле очереди печати Skia не записываются (более крупные), код, который, по-видимому, является проблемой, находится в skBitmap.cpp в методе

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

Записывает растровые значения fWidth, fHeight, fRowBytes, FConfig and isOpaque значений, а затем просто записывает SERIALIZE_PIXELTYPE_NONE (0). Это означает, что файл спула не содержит пиксельной информации о реальном изображениии, следовательно, не может правильно восстановить объект изображения.

Фактически это делает API-интерфейсы writeToStream and createFromStream() бесполезными, поскольку они ненадежно хранят и воссоздают данные изображения.

Имеет кого-либоеще видел такое поведение, и если да, то неправильно ли я использую API, можно ли его обойти, есть ли объяснение, например неполный API / ошибка, и если да, то есть ли планы по исправлению в будущем выпуске Android?

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 26 февраля 2011

Так работает API. Он никогда не предназначался для длительного хранения, но для хранения плоского в текущем процессе или для отправки другому процессу. То, что вы просите, не будет поддержано.

0 голосов
/ 23 ноября 2011

На платформе Honeycomb кажется, что writeToStream () и createFromStream () теперь сохраняют и воссоздают объект Picture, включая большие данные изображения.

Однако он имеет следующие предостережения:

  • Данные изображения, используемые в изображении, должны быть неизменного типа.
  • Данные изображения должны быть созданы со следующими значениями BitmapFactory.Options, установленными в true, inInputShareable и inPurgeable.Это может быть сделано с помощью BitmapFactory.decodeResource (), передавая BitmapFactory.Options.

Так получилось, что изображения, созданные с помощью WebView 'do', содержат подходящие изображения, соответствующие этому критерию, и поэтому могут быть сериализованыи восстановлен.

Я еще не подтвердил, что Ice Cream Sandwich также работает, но я предполагаю / надеюсь, что это будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...