图像到字节[](Xamarin)

本文关键字:Xamarin 到字节 图像 | 更新日期: 2023-09-27 18:19:03

我需要在Parse中保存图像,所以我需要将其转换为byte[]。知道我该怎么做吗?我已经搜索过了,但没有一个选项适合我。我正在使用一个共享的Xamarin Forms项目。下面是一个带有文本的例子:

byte[] data = System.Text.Encoding.UTF8.GetBytes("Working at Parse is great!");
ParseFile file = new ParseFile("resume.txt", data);

我是初学者,我真的需要帮助!

[编辑]:由于某些原因,Xamarin不让我使用System.Drawing.Image。我已经搜索了很多,我发现了这个,但我不能使它工作:

public static byte[] ReadFully(System.IO.Stream input)
{
    using (var ms = new MemoryStream())
    {
        input.CopyTo(ms);
        return ms.ToArray();
    }
}

图像到字节[](Xamarin)

如果您从图片库中选择图像,则可以使用此代码。这段代码还旨在从iOS的照片库中获取图像,并将其作为字节数组保存到数据库中。

你说你已经有一个图像显示作为登录表单,但看到这个的人可能不知道如何从iOS的照片库中获取图像,所以我写了所有的代码来存档获取图像的方式,并将其转换为字节数组。我使用Prism库,但任何框架都可以。

如果你只想知道如何在Xamarin中将图像转换为字节数组。您可以到下面的代码底部作为MainPage类。

首先,创建一个新文件夹并将其命名为Services。在此文件夹下,您可以创建如下界面:

using System;
using System.Threading.Tasks;
using Xamarin.Forms;
using System.IO;
using Foundation;
namespace TestUIImage.Services
{
    public interface IPicturePicker
    {
        Task<NSUrl> GetNSUrlAsync();
    }
}

然后编写GetNSUrlAsync方法的内容。您需要两个方法GetNSUrl和OnImagePickerCancelled,以便用户选择图像或取消选择。

using System;
using System.IO;
using UIKit;
using Xamarin.Forms;
using System.Threading.Tasks;
using Foundation;

namespace TestUIImage.Services
{
    public class PicturePickerImplementation : IPicturePicker
    {
        public PicturePickerImplementation()
        {
        }
        TaskCompletionSource<NSUrl> urltaskCompletionSource;
        UIImagePickerController imagePicker;
        public Task<NSUrl> GetNSUrlAsync()
        {
            // Create and define UIImagePickerController
            imagePicker = new UIImagePickerController
            {
                SourceType = UIImagePickerControllerSourceType.PhotoLibrary,
                MediaTypes = UIImagePickerController.AvailableMediaTypes(UIImagePickerControllerSourceType.PhotoLibrary)
            };
            // Set event handlers
            imagePicker.FinishedPickingMedia += GetNSUrl;
            imagePicker.Canceled += OnImagePickerCancelled;
            // Present UIImagePickerController
            UIWindow window = UIApplication.SharedApplication.KeyWindow;
            var viewController = window.RootViewController;
            viewController.PresentModalViewController(imagePicker, true);
            // Return Task object
            urltaskCompletionSource = new TaskCompletionSource<NSUrl>();
            return urltaskCompletionSource.Task;
        }
        void GetNSUrl(object sender, UIImagePickerMediaPickedEventArgs args)
        {
            urltaskCompletionSource.SetResult(args.ImageUrl);
            imagePicker.DismissModalViewController(true);
        }
        void OnImagePickerCancelled(object sender, EventArgs args)
        {
            taskCompletionSource.SetResult(null);
            imagePicker.DismissModalViewController(true);
        }
    }
}

接下来,你使用DependencyService来注册你的服务,因为在iOS中从图片库中选择一张图片取决于你的平台。

using Prism;
using Prism.Ioc;
using TestUIImage.ViewModels;
using TestUIImage.Views;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
using Prism.Autofac;
using TestUIImage.Services;
[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
namespace TestUIImage
{
    public partial class App : PrismApplication
    {
        public App() : this(null) { }
        public App(IPlatformInitializer initializer) : base(initializer) { }
        protected override async void OnInitialized()
        {
            InitializeComponent();
            DependencyService.Register<PicturePickerImplementation>();
            await NavigationService.NavigateAsync("NavigationPage/MainPage");
        }
        protected override void RegisterTypes(IContainerRegistry    containerRegistry)
        {
            containerRegistry.RegisterForNavigation<NavigationPage>();
            containerRegistry.RegisterForNavigation<MainPage>();
        }
    }
}

然后,在Info中添加这段代码。

    ...
    <key>NSPhotoLibraryUsageDescription</key>
    <string>Picture Picker uses photo library</string>
</dict>
</plist>

最后,您可以在代码隐藏中调用您的服务。在这一次,我使用图像控制器作为TestImage和按钮控制器作为PickPictureButton。

using System;
using System.IO;
using System.Drawing;
using System.Diagnostics;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Foundation;
using Xamarin.Forms;
using TestUIImage.Services;
namespace TestUIImage.Views
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
        }
        async void Handle_Clicked(object sender, System.EventArgs e)
        {
            PickPictureButton.IsEnabled = false;
            NSUrl nSUrl = await DependencyService.Get<IPicturePicker>().GetNSUrlAsync();            
            TestImage.Source = ImageSource.FromStream(() =>
            {
                var ms = new MemoryStream();              
                var imagebytes = File.ReadAllBytes(nSUrl.Path);
                ms.Write(imagebytes, 0, imagebytes.Length);
                ms.Seek(0, SeekOrigin.Begin);
                return ms;
            });
            PickPictureButton.IsEnabled = true;
        }
    }
}

下面是一些将BitmapImage转换为字节的代码[]:

    public byte[] ConvertToBytes(BitmapImage bitmapImage)
    {
        if (bitmapImage != null)
        {
            MemoryStream memStream = new MemoryStream();
            JpegBitmapEncoder encoder = new JpegBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(bitmapImage));
            encoder.Save(memStream);
            return memStream.GetBuffer();
        }
        return null;
    }

下面是一些将byte[]转换为BitmapImage的代码:

    private void LoadImage()
    {
        var image = Services.GetImage(_employeeID);
        if (image.Image != null)
        {
            MemoryStream strmImg = new MemoryStream(image.Image);
            BitmapImage myBitmapImage = new BitmapImage();
            myBitmapImage.BeginInit();
            myBitmapImage.StreamSource = strmImg;
            myBitmapImage.DecodePixelWidth = 200;
            myBitmapImage.DecodePixelWidth = 250;
            myBitmapImage.EndInit();
            this.DemographicInformation.Image = myBitmapImage;
        }
    }