Как получить байт [] фотографии в Xamarin.iOS

Я разрабатываю программное обеспечение для фотографий на Xamarin.iOS. Я использую класс PHPhoto.

Когда я делаю фото, я пытаюсь отправить его в Интернет. Я планирую отправлять их байтами []. Где взять данные для фотографии в методе DidFinishCapture? Когда я запускаю отладку, я вижу, что PHPhotoLibrary.SharedPhotoLibrary.PerformChanges () автоматически сохранит фотографии в библиотеке фотографий.

Как получить фотографии по байту []? Я не нашел его в PhotoData.

Я думал, что в LivePhotoCompanionMovieUrl есть путь для сохраненных фотографий, но он всегда имеет значение null.

    public partial class PhotoCaptureDelegate : AVCapturePhotoCaptureDelegate
    {
        public override void DidFinishCapture(AVCapturePhotoOutput captureOutput, 
                                              AVCaptureResolvedPhotoSettings resolvedSettings, 
                                              NSError error)
        {
            PHPhotoLibrary.RequestAuthorization(status =>
            {
                if (status == PHAuthorizationStatus.Authorized)
                {
                    PHPhotoLibrary.SharedPhotoLibrary.PerformChanges(() =>
                    {
                        var creationRequest = PHAssetCreationRequest.CreationRequestForAsset();
                        creationRequest.AddResource(PHAssetResourceType.Photo, PhotoData, null);

                        var url = LivePhotoCompanionMovieUrl;
                        if (url != null)
                        {
                            var livePhotoCompanionMovieFileResourceOptions = new PAssetResourceCreationOptions
                            {
                                ShouldMoveFile = true
                            };
                            creationRequest.AddResource(PHAssetResourceType.PairedVideo, url, livePhotoCompanionMovieFileResourceOptions);
                        }
                    }, (success, err) =>
                    {
                        if (err != null)
                            Debug.WriteLine($"Error occurered while saving photo to photo library: {error.LocalizedDescription}");
                    });
                }
            });
        }
    }
}


person kaoru    schedule 28.09.2020    source источник


Ответы (1)


Если вы хотите преобразовать фотографию в массив байтов, вы можете использовать плагин Media.Plugin из Nuget, чтобы выбрать или сделать снимок.

await CrossMedia.Current.Initialize();
    
    if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
    {
        DisplayAlert("No Camera", ":( No camera available.", "OK");
        return;
    }

    var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
    {
        SaveToAlbum = true,
        Name = "test.jpg"
    });

    if (file == null)
        return;

Затем сначала преобразуйте его в Stream, а затем в массив байтов.

 Stream stream = file.GetStream();
public byte[] GetImageStreamAsBytes(Stream input)
{
  var buffer = new byte[16*1024];
  using (MemoryStream ms = new MemoryStream())
  {
    int read;
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
    {
                ms.Write(buffer, 0, read);
    }
      return ms.ToArray();
   }
}

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

var imgDate = GetImageStreamAsBytes(stream);

Обновлять

Вы можете использовать UIImagePickerController

 UIImagePickerController imagePicker;

И вызывайте следующие строки, когда нужно сделать снимок

      imagePicker = new UIImagePickerController
        {
            SourceType = UIImagePickerControllerSourceType.Camera,
            MediaTypes = UIImagePickerController.AvailableMediaTypes(UIImagePickerControllerSourceType.Camera)
        };

        // Set event handlers
        imagePicker.FinishedPickingMedia += ImagePicker_FinishedPickingMedia; ;
        imagePicker.Canceled += ImagePicker_Canceled; ;

        // Present UIImagePickerController;
        this.PresentViewController(imagePicker, true, null);
        private void ImagePicker_Canceled(object sender, EventArgs e)
        {
            imagePicker.DismissModalViewController(true);
        }

        private void ImagePicker_FinishedPickingMedia(object sender, UIImagePickerMediaPickedEventArgs args)
        {
            UIImage image = args.EditedImage ?? args.OriginalImage;

            if (image != null)
            {
                // Convert UIImage to .NET Stream object
                NSData data;
                if (args.ReferenceUrl.PathExtension.Equals("PNG") || args.ReferenceUrl.PathExtension.Equals("png"))
                {
                    data = image.AsPNG();
                }
                else
                {
                    data = image.AsJPEG(1);
                }

                Stream stream = data.AsStream();

              
            }
            else
            {
               
            }
            imagePicker.DismissModalViewController(true);
        }
public byte[] GetImageStreamAsBytes(Stream input)
{
  var buffer = new byte[16*1024];
  using (MemoryStream ms = new MemoryStream())
  {
    int read;
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
    {
                ms.Write(buffer, 0, read);
    }
      return ms.ToArray();
   }
}

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

var imgDate = GetImageStreamAsBytes(stream);
person Lucas Zhang    schedule 29.09.2020
comment
Спасибо за подсказку. Я вижу, что Media.Plagin вроде работает, и я подумал, что может сработать. Но нет, не сработало. Media.Plagin может быть NuGet для проектов .NET Standard. В настоящее время я работаю над проектом Xamarin.iOS, поэтому у меня возникла ошибка. Ошибка Не удалось добавить ссылку. Пакет «Xamarin.Essentials» попытался добавить ссылку на фреймворк на «System.Drawing.Common.dll», но он не был найден в GAC. Это может быть ошибка в пакете. Обратитесь к владельцу пакета за помощью. Ошибка HRESULT E_FAIL была возвращена из вызова компонента COM. - person kaoru; 29.09.2020
comment
Получили ли вы UIImage в своем коде при использовании UIImagePickerController? - person Lucas Zhang; 29.09.2020
comment
Проверьте мой ответ на обновление. И не забывайте соглашаться, если это вам поможет :) - person Lucas Zhang; 29.09.2020
comment
Спасибо за совет. Я проверил и работает !!! Я изменил SourceType = UIMAGEPickerControllerSourceType.PhotoLibrary, однако использование FilePicker требует от пользователя некоторых манипуляций. Я хочу автоматически загрузить в Интернет после того, как сделаю снимок, поэтому, пожалуйста, продолжайте рассказывать мне, как получить byte [] напрямую, без использования FilePicker. - person kaoru; 30.09.2020
comment
Спасибо за ваш комментарий. Да, мне известно, что первый код Media.Plungin не использует Picker. Я знаю, что первый код Media.Plungin не использует Picker. Но, к сожалению, Media.Plugin не работает. Вот почему я сейчас запускаю его в коде средства выбора обновлений. - person kaoru; 01.10.2020
comment
Код средства выбора обновлений работает, и я получил UIImage в коде. - person kaoru; 01.10.2020
comment
Замечательно ! Вы можете принять мой ответ, если он вам поможет :) - person Lucas Zhang; 01.10.2020