Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通用windows 8.1应用程序中的用户签名_C#_.net_Xaml_Windows 8.1 - Fatal编程技术网

C# 通用windows 8.1应用程序中的用户签名

C# 通用windows 8.1应用程序中的用户签名,c#,.net,xaml,windows-8.1,C#,.net,Xaml,Windows 8.1,是否可以在windows 8.1移动设备上对文档进行签名?类似画布的东西,用户可以用手或手写笔画出您的签名。这项任务或其他任务是否有任何XAML控件?我一天中大部分时间都在努力解决这个问题。Windows Phone 7和8.0中的内置墨迹控制似乎是在8.1版本中退出的 我使用了Chris W在文章中指出的技术来创建一个控件,该控件可以添加到页面的XAML中并处理其他所有内容 神奇之处在于可写位图、PointerPressed和PointerMoved方法 using Windows.Found

是否可以在windows 8.1移动设备上对文档进行签名?类似画布的东西,用户可以用手或手写笔画出您的签名。这项任务或其他任务是否有任何XAML控件?

我一天中大部分时间都在努力解决这个问题。Windows Phone 7和8.0中的内置墨迹控制似乎是在8.1版本中退出的

我使用了Chris W在文章中指出的技术来创建一个控件,该控件可以添加到页面的XAML中并处理其他所有内容

神奇之处在于可写位图、PointerPressed和PointerMoved方法

using Windows.Foundation;
using Windows.UI;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Media.Imaging;

namespace ProofOfConcept.App.Controls
{
    public class SignatureCaptureControl : Canvas
    {
        private WriteableBitmap _writeableBitmap;

        private Point _currentPoint;
        private Point _oldPoint;

        public SignatureCaptureControl()
        {
            _writeableBitmap = new WriteableBitmap(300, 130);
            PointerPressed += SignatureCaptureControl_PointerPressed;
            PointerMoved += SignatureCaptureControl_PointerMoved;
        }

        private void SignatureCaptureControl_PointerPressed(object sender, PointerRoutedEventArgs e)
        {
            _currentPoint = e.GetCurrentPoint(this).Position;
            _oldPoint = _currentPoint;
        }

        void SignatureCaptureControl_PointerMoved(object sender, PointerRoutedEventArgs e)
        {
            _currentPoint = e.GetCurrentPoint(this).Position;
            _writeableBitmap.DrawLine((int)_currentPoint.X, (int)_currentPoint.Y, (int)_oldPoint.X, (int)_oldPoint.Y, PenColor);
            this.InvalidateArrange();
            _oldPoint = _currentPoint;
        }

        public void ClearSignature()
        {
            _writeableBitmap.Clear();
        }

    }

}
使用以下命令,控件将显示一个300x130白色框,当手指或手写笔拖动到该框上时,该框将绘制线

<Border Background="White">
    <controls:SignatureCaptureControl Height="130" Width="300"/>
</Border>
要获得图像,我们必须从可写位图中提取像素数据,然后将其编码为位图/Gif/Jpeg/Png/等

public Task<byte[]> ReadAsPngImageAsync()
{
    return ReadImageFromWritableBitmapAsync(_writeableBitmap, Windows.Graphics.Imaging.BitmapEncoder.PngEncoderId);
}


internal static async Task<byte[]> ReadImageFromWritableBitmapAsync(Windows.UI.Xaml.Media.Imaging.WriteableBitmap writeableBitmap, Guid encoderId)
{
    var rawPixels = await ConvertBitmapToByteArrayAsync(writeableBitmap);
    var encodedPixels = await EncodePixels(rawPixels, encoderId, (uint)writeableBitmap.PixelWidth, (uint)writeableBitmap.PixelHeight);
    return encodedPixels;
}

private static async Task<byte[]> ConvertBitmapToByteArrayAsync(Windows.UI.Xaml.Media.Imaging.WriteableBitmap bitmap)
{
    using (var stream = bitmap.PixelBuffer.AsStream())
    {
        var pixels = new byte[(uint)stream.Length];
        await stream.ReadAsync(pixels, 0, pixels.Length);
        return pixels;
    }
}

private static async Task<byte[]> EncodePixels(byte[] signaturePixels, Guid encoderId, uint pixelWidth, uint pixelHeight)
{
    using (var randomAccessStream = new Windows.Storage.Streams.InMemoryRandomAccessStream())
    {
        var encoder = await Windows.Graphics.Imaging.BitmapEncoder.CreateAsync(encoderId, randomAccessStream);
        encoder.SetPixelData(Windows.Graphics.Imaging.BitmapPixelFormat.Bgra8, Windows.Graphics.Imaging.BitmapAlphaMode.Premultiplied,
            pixelWidth, pixelHeight,
            96, 96, signaturePixels);
        await encoder.FlushAsync();

        using (var stream = randomAccessStream.GetInputStreamAt(0))
        {
            var pixels = new byte[(uint)randomAccessStream.Size];
            stream.AsStreamForRead().Read(pixels, 0, pixels.Length);
            return pixels;
        }
    }
}

现在我们有了一个以标准形式表示图像的字节数组,我们可以简单地将数据保存到本地存储或提交到服务。

听起来像是在寻找Hi Mat。您有一个以控件为例的项目吗?谢谢