如何解决Xamarin.Forms:将 ImageSource 转换为 Image Byte 数组
我开发了一个 Xamarin.Forms 应用,我在其中使用 Syncfusion SfSignaturePad
实现了一个签名控件我想将签名图像发送到 API。
为此,我已将相关签名的 ImageSource
转换为 byte array
,如下所示:
SfSignaturePad signaturePad;
public byte[] SignaturePadImage { get; set; }
private void BtnConvert_Tapped(object sender,EventArgs e)
{
signaturePad.Save();
if (signaturePad.ImageSource != null)
{
StreamImageSource streamImageSource = (StreamImageSource)signaturePad.ImageSource;
System.Threading.CancellationToken cancellationToken =
System.Threading.CancellationToken.None;
Task<Stream> task = streamImageSource.Stream(cancellationToken);
Stream stream = task.Result;
// store bytes
SignaturePadImage = new byte[stream.Length];
stream.Read(SignaturePadImage,SignaturePadImage.Length);
}
}
这允许我将 byte array
设置为 Source
的 Image
以显示相应的图像。
但是当我将 byte array
发送到 API 时,无法识别图像格式,因为它基于 Xamarin.Forms.ImageSource
。
因此,我想在恢复 ImageSource
之前将我的 byte array
“转换”为格式化图像(如 .PNG、.BMP 等)。
实现这一目标的更好方法是什么?
解决方法
根据 jason 的意见,我使用 Xamarin.Controls.SignaturePad,并通过 signatureView.GetImageStreamAsync(SignatureImageFormat.Png)
获取图像并转换为 byte[]。
首先,安装 Xamarin.Controls.SignaturePad.Forms
然后使用SignaturePadView,请按照代码。
<ContentPage
x:Class="FormsSample.images.Page1"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:controls="clr-namespace:SignaturePad.Forms;assembly=SignaturePad.Forms">
<ContentPage.Content>
<StackLayout x:Name="imagestack">
<Button
x:Name="btn2"
Clicked="btn2_Clicked"
Text="get image from signturePadview" />
<controls:SignaturePadView
x:Name="signatureView"
BackgroundColor="Gray"
StrokeColor="White"
StrokeWidth="3" />
</StackLayout>
</ContentPage.Content>
private async void btn2_Clicked(object sender,EventArgs e)
{
var image = new Xamarin.Forms.Image();
byte[] buffer;
using (Stream bitmap = await signatureView.GetImageStreamAsync(SignatureImageFormat.Png))
{
if(bitmap!=null)
{
long length = bitmap.Length;
buffer = new byte[length];
bitmap.Read(buffer,(int)length);
var stream1 = new MemoryStream(buffer);
image.Source = ImageSource.FromStream(() => stream1);
image.WidthRequest = 50;
image.HeightRequest = 50;
imagestack.Children.Add(image);
}
}
}
我将signatureView图像源转换为byte[],然后显示在Xamarin.Forms Image上,byte[]缓冲区就是你想要获取的Image Byte数组。
,感谢您的建议。
最后,我实施了另一个解决方案,因为 FFImageLoading
已在此项目中使用。
为此,我使用 CachedImage
而不是 Image
:
<ffimageloading:CachedImage x:Name="signatureImg"
Source="{Binding Source={x:Reference SignatureView},Path=SignaturePadImageSource,Mode=TwoWay}"
IsVisible="{Binding Source={x:Reference SignatureView},Path=IsSignatureMode,Converter={StaticResource InverseBoolConverter}}"
VerticalOptions="FillAndExpand"
BackgroundColor="{Binding Source={x:Reference SignatureView},Path=BackColor}" />
然后在我的控件的构造函数中从 Success
订阅 CachedImage
事件:
public CustomSignature()
{
InitializeComponent();
signaturePad = sfSignaturePad;
IsSignatureMode = true;
signatureImg.Success += SignatureImg_Success;
}
然后我可以使用 FFImageLoading 中的 GetImageAsPngAsync()
方法。
private async void SignatureImg_Success(object sender,CachedImageEvents.SuccessEventArgs e)
{
SignaturePadImage2Bytes = await signatureImg.GetImageAsPngAsync((int)signatureImg.Width,(int)signatureImg.Height);
}
我可以像这样共享 PNG 字节数组。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。