流到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();
//}
}
我大概可以使用转换解决您的代码,但对于我的口味有太多的转换你不需要。问题是,在你获得一个流之后,它指向它的结尾。这里是做你需要什么更好的方法:
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放到滚动视图中。在小型设备上而不是写入签名时,它会尝试移动屏幕。
中的问题是否适合您? –
可以请你分享一下你在xaml上使用过哪些控件的细节,以及你的答案,以便我可以尝试实现。 –
与原始问题相同。 xmlns:acr =“clr-namespace:Acr.XamForms.SignaturePad; assembly = Acr.XamForms.SignaturePad”
我认为这种控制很老。你有没有试过Xamarin.Controls.SignaturePad? –
不,我没有,但功能ReadFully有什么问题,因为它无法正确转换 – BRDroid
你正在测试的平台是什么?我将尝试重现 –