微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Xamarin.Forms:将 ImageSource 转换为 Image Byte 数组

如何解决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 设置为 SourceImage显示相应的图像。

但是当我将 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 举报,一经查实,本站将立刻删除。