public void SetImageAsync(string url) { if (url == null) { Image = null; return; } var task = Task.Run(() => { var _image = new NSImage(NSUrl.FromString(url)); NSApplication.SharedApplication.InvokeOnMainThread(() => { Image = _image; CATransaction.Flush(); }); }); }
public async void DidOutputMetadataObjects(AVCaptureMetadataOutput captureOutput, AVMetadataObject[] faces, AVCaptureConnection connection) { Console.WriteLine("Got metadata"); try { List <int> unseen = faceViews.Keys.ToList(); List <int> seen = new List <int>(); CATransaction.Flush(); CATransaction.Begin(); CATransaction.SetValueForKey(NSObject.FromObject(true), (NSString)(CATransaction.DisableActions.ToString())); foreach (var face in faces) { // HACK: int faceId = (face as AVMetadataFaceObject).FaceID; int faceId = (int)(face as AVMetadataFaceObject).FaceID; unseen.Remove(faceId); seen.Add(faceId); FaceView view; if (faceViews.ContainsKey(faceId)) { view = faceViews[faceId]; } else { view = new FaceView(); view.Layer.CornerRadius = 10; view.Layer.BorderWidth = 3; view.Layer.BorderColor = UIColor.Green.CGColor; previewView.AddSubview(view); faceViews.Add(faceId, view); view.Id = faceId; view.Callback = TouchCallBack; if (lockedFaceID != null) { view.Alpha = 0; } } AVMetadataFaceObject adjusted = (AVMetadataFaceObject)(previewView.Layer as AVCaptureVideoPreviewLayer).GetTransformedMetadataObject(face); view.Frame = adjusted.Bounds; } foreach (int faceId in unseen) { FaceView view = faceViews[faceId]; view.RemoveFromSuperview(); faceViews.Remove(faceId); if (faceId == lockedFaceID) { clearLockedFace(); } } if (lockedFaceID != null) { FaceView view = faceViews[lockedFaceID.GetValueOrDefault()]; // HACK: Cast resulting nfloat to float // float size = (float)Math.Max (view.Frame.Size.Width, view.Frame.Size.Height) / device.VideoZoomFactor; float size = (float)(Math.Max(view.Frame.Size.Width, view.Frame.Size.Height) / device.VideoZoomFactor); float zoomDelta = lockedFaceSize / size; float lockTime = (float)(CATransition.CurrentMediaTime() - this.lockTime); float zoomRate = (float)(Math.Log(zoomDelta) / lockTime); if (Math.Abs(zoomDelta) > 0.1) { device.RampToVideoZoom(zoomRate > 0 ? MaxZoom : 1, zoomRate); } } } catch { Console.WriteLine("error weird"); } finally { CATransaction.Commit(); } lock (lockerobj) { if (processingFaceDetection) { return; } processingFaceDetection = true; } //CATransaction.Begin(); //CATransaction.SetValueForKey(NSObject.FromObject(true), (NSString)(CATransaction.DisableActions.ToString())); AVCaptureConnection avcaptureconnection = stillImageOutput.ConnectionFromMediaType(AVMediaType.Video); //AVCaptureAutoExposureBracketedStillImageSettings bracketedstillimagesettings = AVCaptureAutoExposureBracketedStillImageSettings.Create(exposureTargetBias: AVCaptureDevice.ExposureTargetBiasCurrent); //var settings = new AVCaptureBracketedStillImageSettings[] { bracketedstillimagesettings }; //stillImageOutput.PrepareToCaptureStillImageBracket(avcaptureconnection,settings, (status,error)=> { // if (error == null) { // stillImageOutput.CaptureStillImageAsynchronously(avcaptureconnection, // (CMSampleBuffer imageDataSampleBuffer, NSError nserror) => { // if (nserror == null) { // using (var sampleBuffer = imageDataSampleBuffer) { // if (sampleBuffer != null) { // using (NSData imageData = AVCaptureStillImageOutput.JpegStillToNSData(sampleBuffer)) { // if (imageData != null) { // uIImage = UIImage.LoadFromData(imageData); // /// operater your image // //Console.WriteLine(image); // SetImage(uIImage); // } // } // } // else { // Console.WriteLine("something was wrong"); // } // } // } // }); // } //}); //CATransaction.Commit(); //DispatchQueue.MainQueue.DispatchAsync(() => { // CaptureImageWithMetadata(stillImageOutput, avcaptureconnection); //}); //stillImageOutput.CaptureStillImageAsynchronously(avcaptureconnection, //(CMSampleBuffer imageDataSampleBuffer, NSError nserror) => { // if (nserror == null) { // //DispatchQueue.GetGlobalQueue(DispatchQueuePriority.Default).DispatchAsync(() => // //{ // DispatchQueue.MainQueue.DispatchAsync(() => { // UIAlertView alert = new UIAlertView(); // alert.Show(); // }); // //}); // //DispatchQueue.MainQueue.DispatchAsync(delegate // //{ // CIImage image = null; // using (var sampleBuffer = imageDataSampleBuffer) { // NSData imageData = AVCaptureStillImageOutput.JpegStillToNSData(sampleBuffer); // image = CIImage.FromData(imageData); // } // uIImage = image.MakeUIImageFromCIImage(); // ivPictureTaken.BackgroundColor = UIColor.Blue; // //ivPictureTaken.Image = uIImage; // //Thread.Sleep(2000); // //processingFaceDetection = false; // //}); // } // else { // Console.WriteLine("Something went wrong"); // } //}); ivPictureTaken.BackgroundColor = (ivPictureTaken.BackgroundColor == UIColor.Blue)? UIColor.Black : UIColor.Blue; await Task.Delay(1000); CMSampleBuffer sampleBuffer = await stillImageOutput.CaptureStillImageTaskAsync(avcaptureconnection); foreach (var face in faces) { int faceId = (int)(face as AVMetadataFaceObject).FaceID; if (faceViews != null && faceViews.ContainsKey(faceId)) { var view = faceViews[faceId]; view.Frame = CGRect.Empty; view.RemoveFromSuperview(); } } teardownAVFoundationFaceDetection(); CIImage ciImage = null; UIImage uIImage = null; UIImage transformeduIImage = null; using (sampleBuffer ) { NSData imageData = AVCaptureStillImageOutput.JpegStillToNSData(sampleBuffer); arregloJPG = imageData.ToArray(); ciImage = CIImage.FromData(imageData); uIImage = new UIImage(imageData); CGAffineTransform cGAffineTransform = new CGAffineTransform(); switch (deviceOrientation) { case UIDeviceOrientation.Portrait: cGAffineTransform = CGAffineTransform.MakeRotation(DegreesToRadians(0)); break; case UIDeviceOrientation.PortraitUpsideDown: cGAffineTransform = (CGAffineTransform.MakeRotation(DegreesToRadians(180))); break; case UIDeviceOrientation.LandscapeLeft: cGAffineTransform = CGAffineTransform.MakeRotation(DegreesToRadians(90)); break; case UIDeviceOrientation.LandscapeRight: cGAffineTransform = CGAffineTransform.MakeRotation(DegreesToRadians(-90)); //cGAffineTransform.Translate(uIImage.CGImage.Width,0); break; case UIDeviceOrientation.FaceUp: case UIDeviceOrientation.FaceDown: default: break; // leave the layer in its last known orientation } var flags = CGBitmapFlags.PremultipliedFirst | CGBitmapFlags.ByteOrder32Little; // Create a CGImage on the RGB colorspace from the configured parameter above using (var cs = CGColorSpace.CreateDeviceRGB()) { using (CGBitmapContext context = new CGBitmapContext(null, (int)uIImage.CGImage.Width, (int)uIImage.CGImage.Height, uIImage.CGImage.BitsPerComponent, uIImage.CGImage.BytesPerRow, cs, (CGImageAlphaInfo)flags)) { context.ConcatCTM(cGAffineTransform); var cgRect = new CGRect(0, 0, uIImage.CGImage.Width, uIImage.CGImage.Height); context.DrawImage(cgRect, uIImage.CGImage); //ciImage = context.ToImage(); using (CGImage cgImage2 = context.ToImage()) { //pixelBuffer.Unlock(CVPixelBufferLock.None); transformeduIImage = UIImage.FromImage(cgImage2); //return UIImage.FromImage(cgImage); } } } } sampleBuffer.Dispose(); //UIImage uIImage = image2.MakeUIImageFromCIImage(); NSData nsdata = uIImage.ResizeImageWithAspectRatio(640, 480).AsPNG(); ivPictureTaken.Image = UIImage.LoadFromData(nsdata);//uIImage; //byte[] bytes = nsdata.ToArray(); //WriteToFile(nsdata); //string encoded = Base64.EncodeToString(localdata, Base64Flags.Default); //byte[] b = System.IO.File.ReadAllBytes(FileName); //string rutaCarpeta = Environment.GetFolderPath(Environment.SpecialFolder.Personal); //string resultado = "FotoLAB12"; //archivoLocal = resultado + ".jpg"; //ruta = Path.Combine(rutaCarpeta, archivoLocal); //File.WriteAllBytes(ruta, arregloJPG); //ivPictureTaken.Image= UIImage.FromFile(ruta); //DispatchQueue.MainQueue.DispatchAsync(() => { //ivPictureTaken.Image = null; //InvokeOnMainThread(() => { // ivPictureTaken.BackgroundColor = UIColor.Black; // ivPictureTaken = new UIImageView(uIImage); //}); //ivPictureTaken.SetNeedsDisplay(); //CATransaction.Commit(); //}); //DispatchQueue.GetGlobalQueue(DispatchQueuePriority.Default).DispatchAsync(() => //{ ProcessingImage(nsdata); //}); //DispatchQueue.GetGlobalQueue(DispatchQueuePriority.Default).DispatchAsync(() => { // //NSNotificationCenter.DefaultCenter.PostNotificationName("OnFaceDetected", uIImage); //}); //session.StopRunning(); //await Task.Delay(3000); //processingFaceDetection = false; var a = -1; }