2016-12-08 5 views
0

InkCanvasコントロールからバイト配列を取得しようとしていますが、これまでの方法は少し長めに見えます。InkCanvasのストロークをIRandomnaccessStreamに直接送信する

現在、私は次のようにします。

StorageFolder folder = await Windows.Storage.ApplicationData.Current.LocalFolder.GetFolderAsync("Temp"); 
StorageFile file = await folder.CreateFileAsync(GenerateString(5)+".zzx", Windows.Storage.CreationCollisionOption.GenerateUniqueName); 

using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite)) 
{ 
    await SignatureCanvas.InkPresenter.StrokeContainer.SaveAsync(stream);       
    var array = await IRandomAccessStreamToByteArray(stream);     
} 

次のようにカスタムストリームリーダーです。

private async Task<byte[]> IRandomAccessStreamToByteArray(IRandomAccessStream stream) 
{ 
    var reader = new DataReader(stream.GetInputStreamAt(0)); 
    var bytes = new byte[stream.Size]; 
    await reader.LoadAsync((uint)stream.Size); 
    reader.ReadBytes(bytes); 
    return bytes; 
} 

これは機能し、私に必要なバイト配列を与えてくれますが、不要なイメージを残してしまいます。別のコールがファイルを置き換えたいときに書き込まれているファイルのために、いくつかのアクセスの問題があったので、複数のイメージのルートを下ることに決めました。イメージファイルを完全にスキップする方法はありますか?一時フォルダをクリアするのはあまり問題ではありませんが、避けることができればそれが望ましいでしょう。

私はInkCanvasが直接アレイダンプをサポートしていないことを既に読んでいたので、どんな提案も感謝します!

+0

:私たちがイメージにバイト配列を変換したい場合は

private byte[] ConvertInkCanvasToByteArray() { var canvasStrokes = SignatureCanvas.InkPresenter.StrokeContainer.GetStrokes(); if (canvasStrokes.Count > 0) { var width = (int)SignatureCanvas.ActualWidth; var height = (int)SignatureCanvas.ActualHeight; var device = CanvasDevice.GetSharedDevice(); device.DeviceLost += DeviceOnDeviceLost; var renderTarget = new CanvasRenderTarget(device, width, height, 96); using (var ds = renderTarget.CreateDrawingSession()) { ds.Clear(Windows.UI.Colors.White); ds.DrawInk(SignatureCanvas.InkPresenter.StrokeContainer.GetStrokes()); } return renderTarget.GetPixelBytes(); } else { return null; } } private void DeviceOnDeviceLost(CanvasDevice sender, object args) { Debug.WriteLine("DeviceOnDeviceLost"); } 

また、我々は次のコードを使用することができるはず'IRandomAccessStream'を保存し、それを使ってバイト配列を取得します。 –

+0

@ JaydenGu-MSFT上記のコードは実際にファイルを生成しますが、ファイル自体は使用されません(代わりに、新しく書き込まれたストリームデータを挟んで変換します)。私が探しているのは、「ファイルを作成する」中間ステップを削除する方法です(それが可能であれば) – Takarii

+0

更新はありますか?私の答えはあなたの問題を解決しましたか? –

答えて

0

ファイルを作成せずにInkCanvasストロークをバイト配列に保存する場合は、Win2D.uwpを使用できるはずです。

Win2D.uwpをインストールするには、パッケージマネージャーコンソールで "Install-Package Win2D.uwp"コマンドを実行します。

インクストロークのコレクションを描画する方法は、CanvasDrawingSession.DrawInkです。 CanvasBitmap.GetPixelBytesメソッドを使用して、ビットマップ全体の生のバイトデータの配列を取得できるはずです。例えば

:あなたが同じファイルを使用することができるはず

WriteableBitmap bitmap = new WriteableBitmap((int)SignatureCanvas.ActualWidth, (int)SignatureCanvas.ActualHeight); 
await bitmap.PixelBuffer.AsStream().WriteAsync(mybytes, 0, mybytes.Length); 
関連する問題