微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Xamarin.iOS中获取照片的字节[]

如何解决如何在Xamarin.iOS中获取照片的字节[]

我正在Xamarin.iOS中开发摄影软件。 我正在使用PHPhoto类。

拍照时,我正在尝试将其发送到网络上。 我打算以byte []的形式发送它们。 我可以从DidFinishCapture方法获取照片的数据? 当我开始调试启动时,我看到 PHPhotoLibrary.SharedPhotoLibrary.PerformChanges()会自动将照片保存到照片库中。

如何按字节[]检索照片? 我在PhotoData中找不到它。

我认为LivePhotoCompanionMovieUrl中存在用于保存照片的路径,但这始终为空。

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

解决方法

如果要将照片转换为字节数组,可以使用Nuget的插件 Media.Plugin 来拍照。

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,buffer.Length)) > 0)
    {
                ms.Write(buffer,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,read);
    }
      return ms.ToArray();
   }
}

现在您可以像下面这样获取字节数组

var imgDate = GetImageStreamAsBytes(stream);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。