图像到字节[](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();
}
}
如果您从图片库中选择图像,则可以使用此代码。这段代码还旨在从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;
}
}