图像到字节[](Xamarin)

时间:2015-10-23 16:50:46

标签: c# xamarin

我需要在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();
    }
}

提前致谢。

2 个答案:

答案 0 :(得分:0)

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

    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;
        }
    }

这对我很有用。

答案 1 :(得分:0)

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

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

  

如果您只想知道如何在Xamarin.forms中将图像转换为字节数组,则可以转到下面的代码底部作为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>();
        }
    }
}

然后,由于iOS的安全性,您将此代码添加到Info.plist中。

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

最后,您可以在代码隐藏中调用服务。这一次,我将Image控制器用作TestImage,将Button控制器用作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;
        }
    }
}