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

C# 如何在Xamarin.iOS中获取照片的字节[],c#,xamarin.ios,phphotolibrary,C#,Xamarin.ios,Phphotolibrary,我正在用Xamarin.iOS开发一个摄影软件。 我用的是PHPhoto类 当我拍照时,我正试图把它发送到网络上。 我计划用字节[]发送它们。 在哪里可以获得DidFinishCapture方法中照片的数据? 当我启动调试启动时,我看到 PHPhotoLibrary.SharedPhotoLibrary.PerformChanges()将自动将照片保存到照片库中 如何按字节[]检索照片? 我在PhotoData中找不到它 我以为在livephotocompanymovieurl中保存的照片有一个

我正在用Xamarin.iOS开发一个摄影软件。 我用的是PHPhoto类

当我拍照时,我正试图把它发送到网络上。 我计划用字节[]发送它们。 在哪里可以获得DidFinishCapture方法中照片的数据? 当我启动调试启动时,我看到 PHPhotoLibrary.SharedPhotoLibrary.PerformChanges()将自动将照片保存到照片库中

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

我以为在livephotocompanymovieurl中保存的照片有一个路径,但它总是空的

    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的插件拾取或拍照

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 = file.GetStream();
现在可以得到如下所示的字节数组

var imgDate = GetImageStreamAsBytes(stream);
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);
现在可以得到如下所示的字节数组

var imgDate = GetImageStreamAsBytes(stream);
var imgDate = GetImageStreamAsBytes(stream);

谢谢你的提示。我看到媒体了。剽窃似乎奏效了,我想它可能会奏效。但是不,它不起作用。对于.NET标准项目,Media.stricin可以是NuGet。我目前正在从事一个Xamarin.iOS项目,因此我遇到了一个错误。错误:无法添加引用。包“Xamarin.Essentials”试图添加对“System.Drawing.Common.dll”的框架引用,但在GAC中找不到该引用。这可能是软件包中的一个bug。请与包的所有者联系以获得帮助。调用COM组件返回错误HRESULT E_FAIL。使用UIImagePickerController时代码中是否有UIImage?请检查我的更新答案。如果对你有帮助的话,别忘了接受它:)谢谢你的建议。我已经验证了它,它的工作!!!但是,使用FilePicker需要用户进行一些操作。我想在拍照后自动上传到web,请继续告诉我如何不使用FilePicker直接获取byte[],谢谢您的评论。是的,我知道第一个Media.Plungin代码不使用Picker。我知道第一种媒体。Plungin代码不使用选择器。但不幸的是,媒体插件不起作用。这就是为什么我现在在更新的选择器代码中运行它。
var imgDate = GetImageStreamAsBytes(stream);