2010-07-13 2 views
0

В моем приложении пользователь может создавать несколько объектов (так называемые чертежи), каждый из которых имеет SurfaceInkCanvas, очень похожий на Photopad (приложение Paint Paint) в SDKSamples (предоставляется MS Surface SP1 SDK). Что было бы лучшим способом сохранить содержимое inkCanvas (объект рисования), учитывая тот факт, что могут быть созданы десятки или даже сотни из них.Сохранение inkcanvas

После некоторого исследования один вариант выскочил: преобразование его в изображение, jpg или png, но этот метод не кажется масштабируемой ИМО.

Можно ли сохранить точки в базе данных (желательно sqlite)?

Цель состоит в том, чтобы восстановить чертежи (содержимое чернил) для дальнейшего редактирования при загрузке.

ответ

2

уже существует формат, который microsoft использует для сохранения штрихов в ISF - для формата Ink Serialized, который сохраняет коллекцию Strokes в файле .isf.

Однако в примере this каждый чертеж сохраняется в отдельном (но небольшом) файле .isf, который может быть легко загружен для дальнейшего редактирования или даже преобразования (экспорта) его в растровое изображение.

Таким образом, хорошим способом было бы сохранить каждый чертеж в файлах (хотя это немного дороже, по времени, а не просто хранить его в sqlite db) и сохранять путь каждого вместе с идентификатором в база данных для идентификации каждого сеанса. Любое предложение для дальнейшей оптимизации этого метода с точки зрения масштабируемости?

2

Сохранение изображения не является жизнеспособным для того, как оно звучит так, как будто вы хотите сделать, потому что восстановление векторных линий из растрового изображения намного сложнее и потенциально потеряно, чем преобразование вектора в растровое изображение, в дополнение к тому, что оно не очень эффективно от перспектива плотности данных.

Вы можете написать код для сохранения и восстановления коллекции строк, хранящихся в свойстве Strokes. Это позволит вам сократить размер ваших данных до минимума и легко сохранить в базе данных. У каждого Stroke есть некоторые данные о том, как выглядит линия, и набор точек, составляющих линию. Довольно просто извлечь и восстановить эти данные в другой InkCanvas при перезагрузке.

Возможно, вы также можете использовать XamlWriter/XamlReader, чтобы просто сериализовать весь InkCanvas в xml, но вам нужно будет поместить новый десериализованный экземпляр в ваш пользовательский интерфейс и убедиться, что нет никаких именований или ресурсов в вашем XAML, которые имеют тенденцию вызывать ошибки с помощью этого метода.

Смежные вопросы