Преобразовать источник изображений, поступающий из Xam.Плагин.Носитель 5.0.1 в массив байтов в Xamarinforms?

#c# #arrays #xamarin.forms #imagesource

#c# #массивы #xamarin.forms #источник изображений

Вопрос:

 if (!CrossMedia.Current.IsPickPhotoSupported)
        {
            await Application.Current.MainPage.DisplayAlert("Photos Not Supported", ":( Permission not granted to photos.", "OK");
            return;
        }
        var file = await Plugin.Media.CrossMedia.Current.PickPhotoAsync(new Plugin.Media.Abstractions.PickMediaOptions
        {
            PhotoSize = Plugin.Media.Abstractions.PhotoSize.Medium,
        });


        if (file == null)
            return;

        var tmpSrc = ImageSource.FromStream(() =>
        {
            var stream = file.GetStream();
            file.Dispose();
            return stream;
        });
  

ImageSource toBeConverted = tmpSrc;

  • Я хочу, чтобы переменная toBeConverted была преобразована в Byte[], чтобы я мог отправить ее в свой webapi…

Комментарии:

1. File.ReadAllBytes(file.Path);

2. Может ли это сработать?

Ответ №1:

ImageSource это способ предоставить исходное изображение для Xamarin.Формы.Изображение для отображения некоторого содержимого. Если вы уже показываете что-то на экране, ваше Image представление было заполнено данными, поступившими откуда-то еще, например, из файла или ресурса, или сохраненными в массиве в памяти … или как еще вы получили это в первую очередь. Вместо того, чтобы пытаться получить эти данные обратно из ImageSource , вы можете сохранить ссылку на него и загрузить по мере необходимости.

Таким образом, вы могли бы получить массив байтов из файла после выбора фотографии.

 var file = await Plugin.Media.CrossMedia.Current.PickPhotoAsync(new Plugin.Media.Abstractions.PickMediaOptions
    {
        PhotoSize = Plugin.Media.Abstractions.PhotoSize.Medium,
    });
if (file == null)
return;    
var bytes = File.ReadAllBytes(file.Path); // you could get  the byte[] here from the file path.
  

Ответ №2:

  • Этот код также работал для меня…

      private async void Capture()
     {
         if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
         {
             await Application.Current.MainPage.DisplayAlert("No Camera", ":( No camera available.", "OK");
             return;
         }
    
         var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
         {
             Directory = "Test",
             SaveToAlbum = true,
             CompressionQuality = 75,
             CustomPhotoSize = 50,
             PhotoSize = PhotoSize.Medium,
             DefaultCamera = CameraDevice.Front
         });
    
         if (file == null)
             return;
    
         var stream = file.GetStream();
         if (stream != null)
         {
             var StreamByte = ReadAllBytes(stream);
             var NewStream = new MemoryStream(StreamByte);
             // stream = mystream;
             Device.BeginInvokeOnMainThread(() => {
                 ImageSource = ImageSource.FromStream(() => NewStream);
             });
    
             student.ProfilePicture = StreamByte;
         }
     }
     public byte[] ReadAllBytes(Stream instream)
     {
         if (instream is MemoryStream)
             return ((MemoryStream)instream).ToArray();
    
         using (var memoryStream = new MemoryStream())
         {
             instream.CopyTo(memoryStream);
             return memoryStream.ToArray();
         }
     }