2010-07-13 69 views
0

在我的應用程序中,用戶可以創建多個對象(所謂的繪圖),每個對象都有一個SurfaceInkCanvas,與SDKSamples中的Photopad(Photo Paint應用程序)非常相似(由MS Surface SP1 SDK提供)。 考慮到可能會創建數十甚至數百個這樣的事實,保存inkCanvas(繪圖對象)內容的最佳方法是什麼?保存inkcanvas

經過一番研究,一個選項彈出:將其轉換爲圖像,JPG或PNG,但這種方法似乎並不是可擴展的IMO。

是否有可能將點存儲在數據庫(最好是sqlite)?

目標是能夠恢復繪圖(inkCanvas的內容)以便在加載時進一步編輯。

回答

2

微軟已經使用了一種格式來保存筆畫,這是ISF - 表示將Strokes集合保存在.isf文件中的Ink Serialized格式。

但是,在this示例中,每個圖形都保存在一個單獨的(但小尺寸).isf文件中,該文件可以輕鬆加載以便進一步編輯,甚至可以將其轉換(導出)爲位圖。

因此,一個好的方法是將每個圖形保存在文件中(即使這比存儲在sqlite數據庫中要花費更多的時間),並將每個圖形的路徑與id一起保存數據庫來識別每個會話。 從可伸縮性的角度來看,是否有進一步優化此方法的建議?

2

保存圖像並不是真的可行,因爲它聽起來像你想要做的,因爲從位圖中恢復矢量線比矢量到位圖轉換要困難得多,並且可能有損耗,除了從數據密度的觀點。

您可以編寫一些代碼來保存和恢復存儲在Strokes屬性中的行集合。這將使您可以將數據量減小到最小,並輕鬆存儲在數據庫中。每個筆畫都有一些關於線條的數據和一組構成線條的點。在重新加載時,將這些數據提取並復原到另一個InkCanvas相當簡單。

您也許可以使用XamlWriter/XamlReader將整個InkCanvas序列化爲xml,但您需要能夠將新的反序列化實例放入您的UI中,並確保沒有任何命名或資源併發症在你的XAML中,這種方法往往會導致錯誤。