public void OnPreviewFrame (byte [] bytes, Android.Hardware.Camera camera) { if ((DateTime.Now - lastPreviewAnalysis).TotalMilliseconds < 250) return; try { byte[] rotatedData = new byte[bytes.Length]; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) rotatedData[x * height + height - y - 1] = bytes[x + y * width]; } var dataRect = GetFramingRectInPreview(); var luminance = new PlanarYUVLuminanceSource (rotatedData, width, height, dataRect.Left, dataRect.Top, dataRect.Width(), dataRect.Height(), false); var binarized = new BinaryBitmap (new ZXing.Common.HybridBinarizer(luminance)); var result = reader.decodeWithState(binarized); lastPreviewAnalysis = DateTime.Now; if (result == null || string.IsNullOrEmpty (result.Text)) return; Android.Util.Log.Debug("ZXing.Mobile", "Barcode Found: " + result.Text); ShutdownCamera(); activity.OnScan (result); } catch (ReaderException) { Android.Util.Log.Debug("ZXing.Mobile", "No barcode Found"); // ignore this exception; it happens every time there is a failed scan } catch (Exception){ // TODO: this one is unexpected.. log or otherwise handle it throw; } }
public void OnPreviewFrame (byte [] bytes, Android.Hardware.Camera camera) { if ((DateTime.Now - lastPreviewAnalysis).TotalMilliseconds < 150) return; try { //Fix for image not rotating on devices byte[] rotatedData = new byte[bytes.Length]; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) rotatedData[x * height + height - y - 1] = bytes[x + y * width]; } var cameraParameters = camera.GetParameters(); //Changed to using a YUV Image to get the byte data instead of manually working with it! var img = new YuvImage(rotatedData, ImageFormatType.Nv21, cameraParameters.PreviewSize.Width, cameraParameters.PreviewSize.Height, null); var dataRect = GetFramingRectInPreview(); var luminance = new PlanarYUVLuminanceSource (img.GetYuvData(), width, height, dataRect.Left, dataRect.Top, dataRect.Width(), dataRect.Height(), false); //var luminance = new PlanarYUVLuminanceSource(img.GetYuvData(), cameraParameters.PreviewSize.Width, cameraParameters.PreviewSize.Height, 0, 0, cameraParameters.PreviewSize.Width, cameraParameters.PreviewSize.Height, false); var binarized = new BinaryBitmap (new ZXing.Common.HybridBinarizer(luminance)); var result = reader.decodeWithState(binarized); lastPreviewAnalysis = DateTime.Now; if (result == null || string.IsNullOrEmpty (result.Text)) return; Android.Util.Log.Debug("ZXing.Mobile", "Barcode Found: " + result.Text); ShutdownCamera(); activity.OnScan (result); } catch (ReaderException) { Android.Util.Log.Debug("ZXing.Mobile", "No barcode Found"); // ignore this exception; it happens every time there is a failed scan } catch (Exception){ // TODO: this one is unexpected.. log or otherwise handle it throw; } }