2017-06-20 1 views
0

J'utilise un bloc Signature pour les formulaires Xamarin et j'essaie de définir la signature sur une source d'image. J'essaye de convertir le flux en ByteArray mais le bytearray converti est toujours vide.Flux vers ByteArray - Convertir le bloc-signature en image

Dans la fonction ReadFully J'ai essayé deux approches, mais les deux 0 octets de retour

Pourriez-vous s'il vous plaît suggérer où je me trompe.

J'ai regardé sur Internet ont trouvé ces liens

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

Je pense que ce contrôle est assez vieux. Avez-vous essayé Xamarin.Controls.SignaturePad? –

+0

Non, je n'ai pas, mais est quelque chose de mal avec la fonction ReadFully car il ne peut pas convertir correctement – BRDroid

+0

Quelle plate-forme vous êtes en train de tester? Je vais essayer de reproduire –

Répondre

0

Je pourrais probablement corriger votre code en utilisant des conversions, mais pour à mon goût, il y a trop de conversions dont vous n'avez pas besoin. Le problème est que lorsque vous obtenez un flux, il pointe vers la fin. Voici plus de façon optimale de faire ce que vous avez besoin:

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

Remarque, cela ne fonctionne pas bien utiliser JPG parce que vous ne pouvez pas faire fond transparent il montre rectangle noir juste. Cela fonctionne avec PNG. Vous pouvez jeter un oeil à la mise à l'échelle d'une image si la taille du tampon n'est pas la même que celle de votre image

Encore une chose: j'éviterais de mettre stacklayout en scrollview. Sur les petits appareils au lieu d'écrire la signature, il essaie de déplacer l'écran.

Et je regarderais plus de contrôle moderne de Xamarin enter image description here

+0

cela a-t-il fonctionné pour vous? –

+0

pouvez-vous s'il vous plaît partager les détails comme le contrôle que vous avez utilisé à xaml, avec votre réponse afin que je puisse essayer de mettre en œuvre. –

+0

le même que dans la question originale. xmlns: acr = "espace de noms clr: Acr.XamForms.SignaturePad; assembly = Acr.XamForms.SignaturePad"