winform 호출 카메라 스 캔 QR 코드 인식 실현 절차

회사 의 업무 수요 때문에 윈도 시스템 에서 카 메 라 를 호출 하여 QR 코드 수 요 를 식별 해 야 하기 때문에 이런 기능 이 있다.
나 는 인터넷 네티즌 들 이 제공 한 자료 에 근거 하여 스스로 프로젝트 에 통합 하여 응용 하 였 는데 효과 가 괜 찮 았 다.
이제 카메라 호출+QR 코드 인식 이라는 두 가지 기능 을 따로 적어 토론 과 참고 가 되도록 하 겠 습 니 다.
어떤 부족 한 점 이나 문제 가 있 으 면 모두 가 제기 하여 공동으로 진 보 를 개선 할 수 있다.
빈 winform 프로젝트 솔 루 션 을 만 듭 니 다.제 이름 은 ScanQRcode 입 니 다.
Form 1 을 주 창 으로 하고 관련 속성 을 설정 합 니 다:
StartPosition:CenterScreen(창 가운데)
가운데 제목 추가:

private void LoadTitleCenterData()
 {
      string titleMsg ="        ";
      Graphics g = this.CreateGraphics();
      Double startingPoint = (this.Width / 2) - (g.MeasureString(titleMsg, this.Font).Width / 2);
      Double widthOfASpace = g.MeasureString(" ", this.Font).Width;
      String tmp = " ";
      Double tmpWidth = 0;

      while ((tmpWidth + widthOfASpace) < startingPoint)
      {
        tmp += " ";
        tmpWidth += widthOfASpace;
      }
      this.Text = tmp + titleMsg;
 }
최대 최소 화 비활성화:

public Form1()
{
  this.MinimizeBox = false;
  this.MaximizeBox = false;
  InitializeComponent();
  LoadTitleCenterData();
}
Form 1 에 TableLayoutPanel 을 추가 하고 3 줄 3 열 을 추가 합 니 다.비율 은 백분율:10%,80%,10%이렇게
Table LayoutPanel 의 80%에 Table LayoutPanel 을 추가 하 시 겠 습 니까?아니면 행 비율:20%,80%이렇게(28 법칙)
Table LayoutPanel 에 Panel 을 추가 합 니 다.수 동 으로 몇 개의 단추 와 label 을 추가 합 니 다.
최종 화면 은 이렇게(볼 수 있 으 면):

QR 코드 인식 인터페이스 CameraQR 추가:
Nuget 을 사용 하여 인용 을 추가 하고 AForge 를 검색 하면 다음 패키지 가 도 입 됩 니 다.

QR 코드 를 인식 하 는 창 을 추가 합 니 다.이름 은 CameraQR 입 니 다.
VideoSourcePlayer 를 창 에 추가 합 니 다.Fill 표시:

창 에 몇 개의 개인 변 수 를 정의 합 니 다:

 private AForge.Video.DirectShow.FilterInfoCollection _videoDevices;//    
 System.Timers.Timer timer;//   
 CameraHelper _cameraHelper = new CameraHelper();//       
창 Load 이벤트 에서 사진 장치 목록 을 가 져 오고 첫 번 째 장 치 를 카메라 장치 로 사용 합 니 다(예 를 들 어 앞 뒤 두 개 이상 의 카메라 가 있 으 면 코드 를 바 꾸 고 선택 할 수 있 는 것 으로 설정 합 니 다.CameraHelper 의 Create FilterInfoCollection()에서):

private void CameraQR_Load(object sender, EventArgs e)
{
      //         
      _videoDevices = _cameraHelper.CreateFilterInfoCollection();//        
      if (_videoDevices.Count == 0)
      {
        MessageBox.Show("   ");
        this.Dispose();
        this.Close();
        return;
      }
      resultStr = "";//          
      _cameraHelper.ConnectDevice(videoSourcePlayer1);//      
}
구성 요소 초기 화가 완 료 된 후에 시간 임 무 를 추가 하여 카메라 장치 의 이미지 자원 을 단계 적 으로 식별 하 는 데 사용 합 니 다.저 는 200 밀리초 에 한 번 씩 식별 하고 그림 에 QR 코드 가 있 으 면 QR 코드 를 식별 하 는 것 을 썼 습 니 다.식별 에 성공 한 후 창 을 닫 고 식별 결 과 를 이전 인터페이스 로 되 돌려 줍 니 다.여기 에는 식별 QR 코드 패키지 가 필요 합 니 다.
Nuget 을 사용 하여 인용 을 추가 하고 ZXing 을 검색 하면 다음 패 키 지 를 가 져 옵 니 다.

 코드 는 다음 과 같 습 니 다(핵심 코드 는 기본적으로 이것 입 니 다).

public CameraQR()
{
  this.MinimizeBox = false;
  this.MaximizeBox = false;
  InitializeComponent();
  LoadTitleCenterData();
  CheckForIllegalCrossThreadCalls = false;//                
  AddTimer();//      
}

private void AddTimer()
{
 timer = new System.Timers.Timer();
 timer.Enabled = true;
 timer.Interval = 200;
 timer.Start();
 timer.Elapsed += new ElapsedEventHandler(PicToQRCode);
}
private void PicToQRCode(object sender, ElapsedEventArgs e)
{
      if (_cameraHelper.img == null)
        return;
      BinaryBitmap bitmap = null;
      try
      {
        MemoryStream ms = new MemoryStream();
        _cameraHelper.img.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
        byte[] bt = ms.GetBuffer();
        ms.Close();
        LuminanceSource source = new RGBLuminanceSource(bt, _cameraHelper.img.Width, _cameraHelper.img.Height);
        bitmap = new BinaryBitmap(new ZXing.Common.HybridBinarizer(source));
      }
      catch (Exception ex)
      {
        return;
      }

      Result result=null;
      try
      {
        //    
        result = new MultiFormatReader().decode(bitmap);
      }
      catch (ReaderException ex)
      {
        resultStr = ex.ToString();
      }
      if (result != null)
      {
        resultStr = result.Text;
        this.DialogResult = DialogResult.OK;
        this.Close();
      }}
창 이 닫 혔 을 때 타 이 머 를 놓 고 카 메 라 를 끄 는 것 을 기억 하 세 요.

private void CameraQR_FormClosing(object sender, FormClosingEventArgs e)
{
   if (timer != null)
   {
     timer.Dispose();
   }
    _cameraHelper.CloseDevice();
 }
CameraHelper 클래스:

public class CameraHelper
{
  public FilterInfoCollection _videoDevices;//          
  public VideoSourcePlayer _videoSourcePlayer;//    
  public Bitmap img = null;//    ,          
  public System.Drawing.Image CaptureImage(VideoSourcePlayer sourcePlayer = null)
  {

    if (sourcePlayer == null || sourcePlayer.VideoSource == null)
    {
      if (_videoSourcePlayer == null)
        return null;
      else
      {
        sourcePlayer = _videoSourcePlayer;
      }
    }

    try
    {
      if (sourcePlayer.IsRunning)
      {
        System.Drawing.Image bitmap = sourcePlayer.GetCurrentVideoFrame();
        return bitmap;
      }
      return null;

    }
    catch (Exception ex)
    {
      return null;
    }
  }

  public FilterInfoCollection CreateFilterInfoCollection()
  {
    if (_videoDevices != null)
      return _videoDevices;
    _videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
    return _videoDevices;
  }

  public VideoCaptureDevice ConnectDevice(VideoSourcePlayer videoSourcePlayer, FilterInfo filterInfo = null)
  {
    VideoCaptureDevice videoSource = new VideoCaptureDevice();
    if (filterInfo == null)
    {
      videoSource = new VideoCaptureDevice(_videoDevices[_videoDevices.Count - 1].MonikerString);
    }
    else
    {
      videoSource = new VideoCaptureDevice(filterInfo.MonikerString);
    }

    videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);
    videoSourcePlayer.VideoSource = videoSource;
    videoSourcePlayer.Start();
    _videoSourcePlayer = videoSourcePlayer;
    return videoSource;
  }

  private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
  {
    img = (Bitmap)eventArgs.Frame.Clone();
  }

  public void CloseDevice(VideoSourcePlayer videoSourcePlayer = null)
  {
    if (videoSourcePlayer == null)
    {
      if (_videoSourcePlayer == null)
        return;
      _videoSourcePlayer.SignalToStop();
    }
    else
    {
      videoSourcePlayer.SignalToStop();
    }
  }
}
제 가 사용 하 는 테스트 QR 코드 는:

최종 별 결 과 는:

코드:https://github.com/Binzm/ScanQRCode.git
이상 은 winform 호출 카메라 스 캔 코드 인식 QR 코드 의 실현 절차 에 대한 상세 한 내용 입 니 다.winform 호출 카메라 인식 QR 코드 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 시기 바 랍 니 다!

좋은 웹페이지 즐겨찾기