将InkCanvas笔划直接发送到IRandomnaccessStream

时间:2016-12-08 14:42:18

标签: c# uwp

我试图从InkCanvas控件中获取一个字节数组,但到目前为止我提出的方法似乎有点长篇大论。

目前我使用以下内容:

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不支持直接转换到数组转储,所以任何建议都会受到赞赏!

1 个答案:

答案 0 :(得分:0)

如果要将InkCanvas笔划保存到字节数组而不创建文件,则应该能够使用Win2D.uwp

要安装Win2D.uwp,请在程序包管理器控制台中运行“Install-Package Win2D.uwp”命令。

有一种CanvasDrawingSession.DrawInk方法可以绘制一组墨迹笔划。我们应该能够使用CanvasBitmap.GetPixelBytes方法获取整个位图的原始字节数据数组。

例如:

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");
}

此外,如果我们想将bytes数组转换为image,我们应该可以使用以下代码:

WriteableBitmap bitmap = new WriteableBitmap((int)SignatureCanvas.ActualWidth, (int)SignatureCanvas.ActualHeight);
await bitmap.PixelBuffer.AsStream().WriteAsync(mybytes, 0, mybytes.Length);