private void HandleOnPreviewFrameReady(object sender, FastJavaByteArray fastArray) { if (!CanAnalyzeFrame) { return; } _wasScanned = false; _lastPreviewAnalysis = DateTime.UtcNow; _processingTask = Task.Run(() => { try { if (TakePicture) { TakePicture = false; var raw = new byte[fastArray.Count]; fastArray.CopyTo(raw, 0); var img = new YuvImage(raw, ImageFormatType.Nv21, _cameraController.Camera.GetParameters().PreviewSize.Width, _cameraController.Camera.GetParameters().PreviewSize.Height, null); using (var stream = new MemoryStream()) { var rect = new Rect(0, 0, img.Width, img.Height); img.CompressToJpeg(rect, 80, stream); var array = stream.ToArray(); OnPictureTaken?.Invoke(this, array); stream.Close(); } } DecodeFrame(fastArray); } catch (Exception ex) { Console.WriteLine(ex); } }).ContinueWith(task => { if (task.IsFaulted) { Android.Util.Log.Debug(MobileBarcodeScanner.TAG, "DecodeFrame exception occurs"); } }, TaskContinuationOptions.OnlyOnFaulted); }
public static byte[] ConvertToJpg(this FastJavaByteArray self, int width, int height) { byte[] javaByteArray = new byte[self.Count]; self.CopyTo(javaByteArray, 0); using (YuvImage yuvImage = new YuvImage(javaByteArray, ImageFormatType.Nv21, width, height, null)) { using (Rect rect = new Rect(0, 0, width, height)) { byte[] jpg = null; using (var os = new MemoryStream()) { yuvImage.CompressToJpeg(rect, 100, os); jpg = os.ToArray(); os.Close(); } return(jpg); } } }