/// <summary> /// 바코드 검출 시 호출되는 콜백 함수입니다. /// </summary> /// <param name="barcodeData">검출된 바코드 데이터</param> public void OnBarcodeDetected(BarcodeData barcodeData) { if (barcodeData != null) { BarcodeDetected?.Invoke(barcodeData); BarcodeDetectedCommand?.Execute(barcodeData); } }
private void DisplayCam() { while (videoCapture.IsOpened) { var frame = videoCapture.QueryFrame(); FrameGrabbed?.Invoke(this, new FrameGrabbedEventArgs { Frame = frame.Bitmap }); var barcodeReader = new BarcodeReader(); var barcodeDetected = barcodeReader.Decode(frame.Bitmap); if (barcodeDetected != null) { BarcodeDetected?.Invoke(this, new BarcodeDetectedEventArgs { DecodedText = barcodeDetected.Text }); return; } } }
/// <summary> /// 스캐너를 초기화합니다. /// </summary> /// <param name="barcodeFormat">인식할 바코드 포멧</param> /// <param name="sessionPreset">해상도</param> /// <returns></returns> private bool InitScanner(AVMetadataObjectType barcodeFormat, NSString sessionPreset) { // 카메라 접근 권한 확인 if (!IsCameraAuthorized) { this.Write("카메라 사용이 허용되지 않습니다."); return(false); } // 후면 카메라를 캡처할 장치로 설정 Device = AVCaptureDevice .DevicesWithMediaType(AVMediaType.Video) .FirstOrDefault(e => e.Position == AVCaptureDevicePosition.Back); if (Device == null) { this.Write("후면 카메라가 없습니다."); return(false); } // 입력 설정 Input = AVCaptureDeviceInput.FromDevice(Device); if (Input == null) { this.Write("AVCaptureDeviceInput이 null 입니다."); return(false); } // 출력 설정 CaptureDelegate = new CaptureDelegate((metadataObjects) => { if (BarcodeDetected == null) { return; } foreach (var metadata in metadataObjects) { var data = ((AVMetadataMachineReadableCodeObject)metadata).StringValue; BarcodeDetected?.Invoke(new BarcodeData(metadata.Type.ToTmonFormat(), data)); } }); Output = new AVCaptureMetadataOutput(); Output.SetDelegate(CaptureDelegate, DispatchQueue.MainQueue); // 세션 설정 Session = new AVCaptureSession() { SessionPreset = sessionPreset, }; Session.AddInput(Input); Session.AddOutput(Output); // 검출할 바코드 포멧 설정(중요 : 반드시 세션 설정 뒤에 와야함) Output.MetadataObjectTypes = barcodeFormat; // 프리뷰어 설정 Previewer = AVCaptureVideoPreviewLayer.FromSession(Session); Previewer.Frame = CGRect.Empty; Previewer.VideoGravity = AVLayerVideoGravity.ResizeAspectFill; Previewer.Connection.VideoOrientation = DeviceOrientation; return(true); }