qrcode render 二维码扫描读取

著名的 qrcode 是 zxing

https://github.com/zxing/zxing 基于 java, java 真的是轮子多啊...

zxing 的 javascript 版本是

https://github.com/LazarSoft/jsqrcode

这个版本的代码非常的 old school.

一上来就是十几行 script, 完全没有模块管理概念. 一堆全局变量

no npm, no typescript.

不过运行是 ok 的, 所以大家可以放心用.

主要的功能是 qrcode.js 里面的 process 方法, 大家可以看看源码.

只要设定好 qrcode.width, height, imageData 再调用 process 就可以了.

至于如何获取 width,height,imageData 就随便我们咯, 可以是 img upload -> canvas -> imageData,  也可以是用 WebRTC -> video -> canvas -> imageData

demo 里面有 WebRTC 的实现可以参考.

下面是例子 :

import { Component, ElementRef, ViewChild } from ‘@angular/core‘;

@Component({
  selector: ‘app-root‘,
  templateUrl: ‘./app.component.html‘,
  styleUrls: [‘./app.component.css‘]
})
export class AppComponent {
  title = ‘app‘;

  @ViewChild(‘videoEl‘, { read: ElementRef })
  videoEL: ElementRef;

  start() {
    let video = this.videoEL.nativeElement as HTMLVideoElement;
    navigator.mediaDevices.getUserMedia({ video: true, audio: false }).then((stream) => {
      video.src = window.URL.createObjectURL(stream);
      video.play();

      let canvas = document.createElement(‘canvas‘) as HTMLCanvasElement;
      let context = canvas.getContext(‘2d‘);

      let interval = setInterval(() => {

        canvas.width = video.videoWidth
        canvas.height = video.videoHeight;
        context.drawImage(video, 0, 0);
        let qrcode = window[‘qrcode‘];
        qrcode.debug = false;
        qrcode.width = canvas.width;
        qrcode.height = canvas.height;
        qrcode.imagedata = context.getImageData(0, 0, canvas.width, canvas.height);
        try {
          let result = qrcode.process();
          console.log(result);
          clearInterval(interval);
          video.pause();
          stream.getTracks()[0].stop();
        }
        catch (e) {
          console.log(e);
        }

      }, 500);

    }).catch(() => {
      console.log(‘user no allow‘);
    });
  }

  upload(files: FileList) {
    let file = files[0];
    let img = new Image();
    img.onload = (e) => {

      window.URL.revokeObjectURL(img.src);
      // document.body.appendChild(img);

      let canvas = document.createElement(‘canvas‘) as HTMLCanvasElement;
      let context = canvas.getContext(‘2d‘);
      canvas.width = img.width;
      canvas.height = img.height;
      context.drawImage(img, 0, 0);
      // document.body.appendChild(canvas);

      let qrcode = window[‘qrcode‘];
      qrcode.debug = false;
      qrcode.width = canvas.width;
      qrcode.height = canvas.height;
      qrcode.imagedata = context.getImageData(0, 0, canvas.width, canvas.height);
      console.log(qrcode.imagedata);

      try {
        let result = qrcode.process();
        console.log(result);
      }
      catch (e) {
        console.log(e);
      }
    }
    img.src = window.URL.createObjectURL(file);
  }

  go() {
    let qrcode = window[‘qrcode‘];
    qrcode.setWebcam(‘video‘);
    qrcode.callback = function (decodedDATA) {
      alert(decodedDATA);
    };
  }
}

html

  <video #videoEl id="video" width="400" height="400">
  </video>

  <!-- <div (click)="go()" >start</div> -->
  <div (click)="start()" >start</div>

  <input type="file" (change)="upload($event.target.files)" >

index.html

<body>

  <!-- 不打包压缩的话, 118kb -->
  <script src="/assets/qrcode/grid.js"></script>
  <script src="/assets/qrcode/version.js"></script>
  <script src="/assets/qrcode/detector.js"></script>
  <script src="/assets/qrcode/formatinf.js"></script>
  <script src="/assets/qrcode/errorlevel.js"></script>
  <script src="/assets/qrcode/bitmat.js"></script>
  <script src="/assets/qrcode/datablock.js"></script>
  <script src="/assets/qrcode/bmparser.js"></script>
  <script src="/assets/qrcode/datamask.js"></script>
  <script src="/assets/qrcode/rsdecoder.js"></script>
  <script src="/assets/qrcode/gf256poly.js"></script>
  <script src="/assets/qrcode/gf256.js"></script>
  <script src="/assets/qrcode/decoder.js"></script>
  <script src="/assets/qrcode/qrcode.js"></script>
  <script src="/assets/qrcode/findpat.js"></script>
  <script src="/assets/qrcode/alignpat.js"></script>
  <script src="/assets/qrcode/databr.js"></script> 

  <app-root></app-root>
</body>
时间: 2024-11-15 13:13:41

qrcode render 二维码扫描读取的相关文章

【React Native 实战】二维码扫描

1.前言今天介绍React Native来实现二维码扫描的功能.首先我们要借助第三方插件react-native-barcode-scanner-universal来实现跨平台二维码扫描. 2.介绍 react-native-barcode-scanner-universal react-native-barcode-scanner-universal是react-native-barcodescanner和react-native-camera的结合,react-native-barcodes

iOS使用AVFoundation实现二维码扫描

实现过程如下: Step1:需要导入:AVFoundation Framework 包含头文件: #import <AVFoundation/AVFoundation.h> Step2:设置捕获会话 设置 AVCaptureSession 和 AVCaptureVideoPreviewLayer 成员 1 2 3 4 5 6 7 8 9 10 #import <AVFoundation/AVFoundation.h> static const char *kScanQRCodeQu

【转】 iOS使用AVFoundation实现二维码扫描

原文:http://strivingboy.github.io/blog/2014/11/08/scan-qrcode/ 关于二维码扫描有不少优秀第三方库如: ZBar SDK 里面有详细的文档,相应介绍也非常多,如:http://rdcworld-iphone.blogspot.in/2013/03/how-to-use-barcode-scanner-br-and-qr-in.html ZXing google推出的开源项目,相应介绍如:http://blog.devtang.com/blo

iOS开发-二维码扫描和应用跳转

iOS开发-二维码扫描和应用跳转 序言 前面我们已经调到过怎么制作二维码,在我们能够生成二维码之后,如何对二维码进行扫描呢? 在iOS7之前,大部分应用中使用的二维码扫描是第三方的扫描框架,例如ZXing或者ZBar.使用时集成麻烦,出错也不方便调试.在iOS7之后,苹果自身提供了二维码的扫描功能,从效率上来说,原生的二维码远高于这些第三方框架.本文讲解如何使用原生框架实现二维码扫描功能,并且进行扫描后的项目跳转.ps:本期的源代码会在文章结尾给出链接 扫描相关类 二维码扫描需要获取摄像头并读取

iOS 系统二维码扫描(可限制扫描区域)

使用 AVFoundation系统库来进行二维码扫描并且限制扫描二维码的范围.(因为默认的是全屏扫描) -(void)beginCode { //1.摄像头设备 AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; /* // Media types AVMediaTypeVideo AVMediaTypeAudio AVMediaTypeText AVMediaTypeC

二维码扫描开源库ZXing定制化

(抱歉文章还在修改但是不小心发布了= =) 最近在用ZXing这个开源库做二维码的扫描模块,开发过程的一些代码修改和裁剪的经验和大家分享一下. 我的代码库: https://github.com/SickWorm/ZXingDialog 代码没有在github维护,所以没有log.但是所有修改的地方我都加上了“@ch”的注释,以方便定位 官方源码: https://github.com/zxing/zxing 实现功能: 1.功能裁剪(只保留QRCode二维码扫描功能,去掉条形码等其他码扫描功能

android利用zbar二维码扫描-(解决中文乱码及扫描区域定义)

写在最前(这是对上一篇博文的问题做的更新[android利用zbar二维码扫描]) project下载   zbarLib编译project  project下载0积分 bug 在2.3的系统中Holder须要设置type,否则会黑屏(感谢网友[(α ⒎待sんа)294439435]) com.example.qu.MainActivity的第50行mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 今天发现 在com.exampl

php 实现 二维码 扫描登录

本人简单实现的示例,使用任意二维码工具打开二维码对应链接 http://www.vincentguo.cn/demo/scan 原理介绍: 第一步:访问登录页面,生成唯一key,例如MkhjDFL=,并且将此key 存入cache,对应值为-1 ,-1表示未登录 ,key有效期我设置的为5分钟,过期就会重新生成二维码图片 第二步:生成二维码,本人使用库(https://github.com/2amigos/yii2-qrcode-helper),二维码对应的链接 http://www.vince

Swift AVFoundation 二维码扫描和生成

项目最终不须要支持iOS6了(泪崩),在二维码扫描这一块,可以全然的放弃ZXing库,改用系统的AVFoundation了,拿swift写了个Demo,效果例如以下: github地址:点这里 有关AVFoundation和Core Image(滤镜等),可以先看看objc.io第21期和第23期的有关介绍. 初始化视频捕捉 // 初始化视频捕获 private func initCapture() { // 代表抽象的硬件设备,这里传入video let captureDevice = AVC