【问题标题】:Stream to ByteArray - Convert Signature pad to ImageStream to ByteArray - 将签名板转换为图像
【发布时间】:2017-11-22 17:28:01
【问题描述】:

我正在为 Xamarin 表单使用签名板,并且我正在尝试将签名设置为图像源。

我正在尝试将流转换为 ByteArray,但转换后的 bytearray 始终为空。

在函数 ReadFully 中我尝试了两种方法,但都返回 0 字节

你能建议我哪里出错了。

我在网上查到了这些链接

https://forums.xamarin.com/discussion/19853/load-image-form-byte-array

XAML

    <?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="Radical.Views.DocketSignaturePad"
             xmlns:acr="clr-namespace:Acr.XamForms.SignaturePad;assembly=Acr.XamForms.SignaturePad"
             Title="DocketSignaturePad">
  <ScrollView>
    <StackLayout Padding="10">
            <acr:SignaturePadView
                x:Name="padView"
                HeightRequest="320"
                WidthRequest="240"

                BackgroundColor="White"
                CaptionText="Caption This"
                CaptionTextColor="Black"
                ClearText="Clear Me!"
                ClearTextColor="Red"
                PromptText="Prompt Here"
                PromptTextColor="Red"
                SignatureLineColor="Aqua"
                StrokeColor="Black"
                StrokeWidth="2"
            />

            <Button Clicked="OnChangeTheme" Text="Change Theme" />
            <Button Clicked="SaveSignature" Text="Save signature"/>
            <Image x:Name="signatureImage" WidthRequest="300" HeightRequest="100" BackgroundColor="Blue"/>
        </StackLayout>
  </ScrollView>
</ContentPage>

Xaml.cs

    async void SaveSignature(object sender, EventArgs e)
        {

            List<DrawPoint> signaturePoints = padView.GetDrawPoints().ToList();

            if (signaturePoints.Count > 0)
            {
                Stream imageAsBytes = new MemoryStream(ReadFully(padView.GetImage(ImageFormatType.Jpg)));
                signatureImage.Source = ImageSource.FromStream(() => new MemoryStream(ReadFully(padView.GetImage(ImageFormatType.Jpg))));
}
}

public static byte[] ReadFully(Stream input)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                input.CopyTo(ms);
                return ms.ToArray();
            }


            //byte[] buffer = new byte[16 * 1024];
            //using (MemoryStream ms = new MemoryStream())
            //{
            //    int read;
            //    while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
            //    {
            //        ms.Write(buffer, 0, read);
            //    }
            //    return ms.ToArray();
            //}


        }

【问题讨论】:

  • 我认为这个控件已经很老了。你试过 Xamarin.Controls.SignaturePad 吗?
  • 不,我没有,但函数 ReadFully 有什么问题,因为它无法正确转换
  • 你在什么平台上测试这个?我会尝试重现
  • 这是一个 Xamarin 表单应用程序。我还没有编写任何特定于平台的代码。我所有的代码都在共享代码中。我在安卓手机上测试过。签名板工作得很好,没有问题。它还从焊盘获取数据。我想看到的是将其转换为图像并显示,从它的转换是 ReadFully 函数中的问题

标签: arrays image stream xamarin.forms signaturepad


【解决方案1】:

您可以使用此代码,它对我有用:

Stream image = await sign.GetImageStreamAsync(SignatureImageFormat.Png);                   
img_signature.Source = ImageSource.FromStream(() => image);

【讨论】:

    【解决方案2】:

    我可能可以使用转换来修复您的代码,但根据我的口味,您不需要的转换太多。问题是在你得到一个流之后它指向它的结尾。以下是满足您需要的更佳方式:

    void SaveSignature(object sender, EventArgs e)
    {
                List<DrawPoint> signaturePoints = padView.GetDrawPoints().ToList();
                if (signaturePoints.Count > 0)
                {
                    Stream s = padView.GetImage(ImageFormatType.Png);
                    //s.Position = 0; or
                    s.Seek(0,SeekOrigin.Begin);
                    signatureImage.Source = ImageSource.FromStream(() => { return s; });
                }
    }
    

    注意,它不能很好地使用 JPG,因为你不能使它成为透明背景,所以它只显示黑色矩形。它适用于 PNG。如果 pad 与您的图像大小不同,您可能会查看缩放图像

    还有一件事:我会尽量避免将 stacklayout 放入滚动视图中。在小型设备上,它尝试移动屏幕而不是编写签名。

    我会看看来自 Xamarin 的更现代的控制

    【讨论】:

    • 能否请您分享您在 xaml 中使用的控件等详细信息以及您的答案,以便我尝试实施。
    • 与原始问题相同。 xmlns:acr="clr-namespace:Acr.XamForms.SignaturePad;assembly=Acr.XamForms.SignaturePad"
    猜你喜欢
    • 2017-03-24
    • 2020-11-24
    • 2012-04-28
    • 2012-12-06
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 2014-04-28
    相关资源
    最近更新 更多