流到ByteArray - 将签名垫转换为图像

问题描述:

我正在使用Xamarin形式的签名垫,并试图将签名设置为图像源。流到ByteArray - 将签名垫转换为图像

我想将流转换为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(); 
      //} 


     } 
+0

我认为这种控制很老。你有没有试过Xamarin.Controls.SignaturePad? –

+0

不,我没有,但功能ReadFully有什么问题,因为它无法正确转换 – BRDroid

+0

你正在测试的平台是什么?我将尝试重现 –

我大概可以使用转换解决您的代码,但对于我的口味有太多的转换你不需要。问题是,在你获得一个流之后,它指向它的结尾。这里是做你需要什么更好的方法:

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。你可能会考虑缩放图像,如果垫的尺寸与图像不一样

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

而且我想看看更多的现代控制从Xamarin enter image description here

+0

中的问题是否适合您? –

+0

可以请你分享一下你在xaml上使用过哪些控件的细节,以及你的答案,以便我可以尝试实现。 –

+0

与原始问题相同。 xmlns:acr =“clr-namespace:Acr.XamForms.SignaturePad; assembly = Acr.XamForms.SignaturePad”