Преобразование изображения в строку с базой 64 xamarin - PullRequest
0 голосов
/ 07 мая 2020

Я следовал этому руководству здесь https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/dependency-service/photo-picker

async void OnPickPhotoButtonClicked(object sender,EventArgs e)
{
            (sender as Image).IsEnabled = false;

            Stream stream = await DependencyService.Get<IPhotoPickerService>().GetImageStreamAsync();
            if(stream != null)
            {
                temp_photo.Source = ImageSource.FromStream(() => stream);
            }

            (sender as Image).IsEnabled = true;
}

Когда я выберу изображение с его помощью, оно покажет изображение из галереи в

What Мне нужно преобразовать изображение в base64_string, чтобы его можно было отправить на наш сервер

Я пробовал следовать принятому ответу по этой ссылке https://forums.xamarin.com/discussion/81344/how-to-convert-image-from-plugin-media-to-base64

var stream = file.GetStream();
var bytes = new byte [stream.Length];
await stream.ReadAsync(bytes, 0, (int)stream.Length);
string base64 = System.Convert.ToBase64String(bytes);

Принятие моего метода, чтобы он выглядел так

async void OnPickPhotoButtonClicked(object sender,EventArgs e)
        {
            (sender as Image).IsEnabled = false;

            Stream stream = await DependencyService.Get<IPhotoPickerService>().GetImageStreamAsync();
            if(stream != null)
            {
                temp_photo.Source = ImageSource.FromStream(() => stream);

                var bytes = new byte[stream.Length];
                await stream.ReadAsync(bytes, 0, (int)stream.Length);
                string base64 = System.Convert.ToBase64String(bytes);
            }

            (sender as Image).IsEnabled = true;
        }

Но при выборе изображения это приводит к тому, что приложение ломается sh

Как я могу преобразовать выбранное изображение в строку base64 ?

Для справки, я тестирую устройство android

Изменить: мой метод заключен в блок try, чтобы поймать исключение, и вот что он говорит

Указанный метод не поддерживается.

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Попробуйте скопировать steam на новый MemoryStream вот так:

async void OnPickPhotoButtonClicked(object sender, EventArgs e)
    {

        Stream stream = await DependencyService.Get<IPhotoPickerService>().GetImageStreamAsync();
        if (stream != null)
        {
            using (MemoryStream memory = new MemoryStream())
            {
                stream.CopyTo(memory);
                byte[] bytes = memory.ToArray();
                image.Source = ImageSource.FromStream(() => new MemoryStream(bytes));
                string base64 = System.Convert.ToBase64String(bytes);
            }

        }

        (sender as Button).IsEnabled = true;
    }
0 голосов
/ 07 мая 2020

Попробуйте.

public static class StreamExtensions
{
    public static string ConvertToBase64(this Stream stream)
    {
        var bytes = new Byte[(int)stream.Length];

        stream.Seek(0, SeekOrigin.Begin);
        stream.Read(bytes, 0, (int)stream.Length);

        return Convert.ToBase64String(bytes);
    }
}


try {

    var base64String = stream.ConvertToBase64();

} catch (Exception ex){

    Console.WriteLine(ex.message);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...