如何以iOS xamarin形式获取自定义渲染器相机的捕获图像

问题描述

我们在应用程序中使用了自定义相机。我已经使用下面提到的链接实现了自定义相机。单击捕获按钮时,相机预览将停止并且工作正常,但是如何获取捕获的图像数据,我想将图像保存在图库中并返回路径。我已经通过使用PictureCallback在android中获取了捕获的图像数据。请帮助我。

自定义相机链接: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/custom-renderer/view

解决方法

看看this blog。 为了获取AVCapturePhotoCaptureDelegate中的图像数据,我添加了AVCapturePhotoOutput photoOutput。这是一个示例:

public class UICameraPreview : UIView
{
    AVCaptureVideoPreviewLayer previewLayer;
    CameraOptions cameraOptions;

    AVCapturePhotoOutput photoOutput;

    public event EventHandler<EventArgs> Tapped;

    public AVCaptureSession CaptureSession { get; private set; }

    public bool IsPreviewing { get; set; }

    public UICameraPreview (CameraOptions options)
    {
        cameraOptions = options;
        IsPreviewing = false;
        Initialize ();
    }

    public override void LayoutSubviews()
    {
        base.LayoutSubviews();

        if (previewLayer != null)
            previewLayer.Frame = Bounds;
    }

    public override void TouchesBegan (NSSet touches,UIEvent evt)
    {
        base.TouchesBegan (touches,evt);
        OnTapped ();
    }

    protected virtual void OnTapped ()
    {
        var eventHandler = Tapped;
        if (eventHandler != null) {
            eventHandler (this,new EventArgs ());
        }
    }

    void Initialize ()
    {
        CaptureSession = new AVCaptureSession ();
        previewLayer = new AVCaptureVideoPreviewLayer (CaptureSession) {
            Frame = Bounds,VideoGravity = AVLayerVideoGravity.ResizeAspectFill
        };

        //self.photoOutput.capturePhoto(with: AVCapturePhotoSettings(),delegate: self)

        photoOutput = new AVCapturePhotoOutput();
        
        CaptureSession.AddOutput(photoOutput);

        photoOutput.CapturePhoto(AVCapturePhotoSettings.Create(),new myDelegate());

        var videoDevices = AVCaptureDevice.DevicesWithMediaType (AVMediaType.Video);
        var cameraPosition = (cameraOptions == CameraOptions.Front) ? AVCaptureDevicePosition.Front : AVCaptureDevicePosition.Back;
        var device = videoDevices.FirstOrDefault (d => d.Position == cameraPosition);

        if (device == null) {
            return;
        }

        NSError error;
        var input = new AVCaptureDeviceInput (device,out error);
        CaptureSession.AddInput (input);
        Layer.AddSublayer (previewLayer);
        CaptureSession.StartRunning ();
        IsPreviewing = true;
    }
}

public class myDelegate : AVCapturePhotoCaptureDelegate {

    public override void DidFinishCapture(AVCapturePhotoOutput captureOutput,AVCaptureResolvedPhotoSettings resolvedSettings,NSError error)
    {
        base.DidFinishCapture(captureOutput,resolvedSettings,error);
    }

    public override void DidFinishProcessingPhoto(AVCapturePhotoOutput output,AVCapturePhoto photo,NSError error)
    {
        base.DidFinishProcessingPhoto(output,photo,error);

        if (error == null)
        {
            var photodata = photo.FileDataRepresentation;
        }
    }
}

我还没有将所有快速代码都翻译成c#,请随时问我是否有问题。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...