精华内容
下载资源
问答
  • 一款很不错的IP摄像头 扫描 输入起始IP 和终止IP 就可以自动扫描网段中的IP摄像头
  • 经过一系列的查找最后发现可以使用 JS调用手机摄像头然后用画布把当前摄像头的数据转成Base64的png图片,经过QrCode直接再本地识别。 优点: 兼容大多数浏览器 本地识别不占用服务端资源 代码比较简单只有一个页面 ...
  • 网络摄像头扫描

    2017-06-03 19:00:52
    网络摄像头扫描
  • Android APP使用WebView调用H5页面完成摄像头扫描二维码 项目使用Android Studio,打开项目可以直接运行,用过的都说好:)
  • 用mui做的纯html5打开摄像头扫描二维码的项目
  • Android Zxing包 调用手机摄像头去进行条码扫描。目前我只试了一维码和二维码。
  • 用电脑摄像头扫描二维码 java做的一个小程序 很好用
  • android前置摄像头扫描二维码
  • 全源代码,免费、无限制,调用电脑摄象头扫描二维码; 网上找了一堆,要不就是部份代码,要不就是收费;本人研究了几天,写了一个实例,共享给大家,忘大家相互学习。谢谢
  • 二维码的生成和调用摄像头扫描, 网上的资源,修改后,绝对好用。 是google的zxing, zxing做的很全面,支持各种语言和平台,具体不多讲,自己查去。ThroughWork做的比较早,貌似现在没人维护了。 所以选择了...
  • 直接下载可以运行, android studio 工具开发, webview引用的本地页面 或者远程页面调用android 摄像头, 通过zxing解析包 进行二维码解析
  • 图像扫描 用手机摄像头扫描图像
  • 天下代码一大抄,找来找去都不能实现这功能,最后自己依葫芦画瓢写了一个,仅供参考
  • C#调用摄像头扫描二维码,生成二维码第二版

    千次下载 热门讨论 2015-01-07 19:39:30
    修复了在某些win7 64位电脑无法扫描二维码的BUG 在C#下通过DirectShow控制摄像头,实现快照后解码二维码。 在winXP及win7下测试通过。 希望此代码对使用C#开发摄像头和二维码应用的人有用。
  • Android通过摄像头扫描纸质文档上打印出来的条码和微信码
  • 大家都知道手机可以扫描二维码的软件很多,但是电脑版扫描二维码的软件却不多,特别是可以利用自带摄像头扫描二维码的软件,这款软件可以实现利用自带摄像头扫描二维码! 注意!注意!,本软件不支持windows 8.x...
  • PC端调用摄像头扫描二维码,拿到二维码信息 <template> <el-dialog title="扫描设备二维码" :visible.sync="dialogVisible" width="40%" @close="closeCamera" > <main class="reader"> &...

    PC端调用摄像头扫描二维码,拿到二维码信息

    <template>
      <el-dialog
        title="扫描设备二维码"
        :visible.sync="dialogVisible"
        width="40%"
        @close="closeCamera"
      >
        <main class="reader">
          <el-input
            v-model="result"
            style="width: 80% "
            type="textarea"
            :rows="2"
            placeholder="二维码识别结果"
          />
          <button class="sweep" @click="media()">扫一扫</button>
        </main>
        <canvas ref="canvas" class="canvas" />
        <span slot="footer" class="dialog-footer">
          <el-button size="small" @click="dialogVisible = false">取 消</el-button>
          <el-button type="primary" size="small" @click="onConfirm">确 定</el-button>
        </span>
      </el-dialog>
    </template>
    
    <script>
    import jsQR from 'jsqr'
    // import Jimp from 'jimp'
    export default {
      name: 'Reader',
      data() {
        return {
          dialogVisible: false,
          timer: null,
          result: '',
          isAnimation: true,
          audio: Object,
          video: Object,
          cvsele: Object,
          canvas: Object
        }
      },
      methods: {
        show(val) {
          this.dialogVisible = true
          this.$nextTick(() => {
            this.result = val
            this.audio = new Audio('../assets/tone.mp3')
            this.video = document.createElement('video')
            this.cvsele = this.$refs.canvas
            this.canvas = this.cvsele.getContext('2d')
            this.canvas.clearRect(0, 0, this.cvsele.width, this.cvsele.height)
            this.cvsele.style.display = 'none'
          })
        },
        draw(begin, end) {
          this.canvas.beginPath()
          this.canvas.moveTo(begin.x, begin.y)
          this.canvas.lineTo(end.x, end.y)
          this.canvas.lineWidth = 3
          this.canvas.strokeStyle = 'red'
          this.canvas.stroke()
        },
    
        sweep() {
          if (this.video.readyState === this.video.HAVE_ENOUGH_DATA) {
            const { videoWidth, videoHeight } = this.video
            this.cvsele.width = videoWidth
            this.cvsele.height = videoHeight
            this.canvas.drawImage(this.video, 0, 0, videoWidth, videoHeight)
            try {
              const img = this.canvas.getImageData(0, 0, videoWidth, videoHeight)
              this.imgurl = img
              const obj = jsQR(img.data, img.width, img.height, {
                inversionAttempts: 'dontInvert'
              })
              if (obj) {
                const loc = obj.location
                this.draw(loc.topLeftCorner, loc.topRightCorner)
                this.draw(loc.topRightCorner, loc.bottomRightCorner)
                this.draw(loc.bottomRightCorner, loc.bottomLeftCorner)
                this.draw(loc.bottomLeftCorner, loc.topLeftCorner)
                if (this.result !== obj.data) {
                  this.audio.play()
                  this.result = obj.data
                  this.isAnimation = false
                  cancelAnimationFrame(this.timer)
                  setTimeout(() => {
                    this.cvsele.style.display = 'none'
                  }, 1000)
                } else {
                  console.log(this.result !== obj.data)
                  alert('重复的二维码,请检查后重新扫描!')
                }
              }
            /*  else {
                console.error('识别失败,请检查二维码是否正确!0000')
              }*/
            } catch (err) {
              console.error('识别失败,请检查二维码是否正确!', err)
            }
          }
          if (this.isAnimation) {
            this.timer = requestAnimationFrame(() => {
              this.sweep()
            })
          }
        },
        media() {
          this.isAnimation = true
          this.cvsele.style.display = 'block'
          navigator.getUserMedia =
              navigator.getUserMedia ||
              navigator.webkitGetUserMedia ||
              navigator.mozGetUserMedia ||
              navigator.msGetUserMedia
          if (navigator.mediaDevices) {
            navigator.mediaDevices
              .getUserMedia({
                video: { facingMode: 'environment' }
              })
              .then((stream) => {
                this.video.srcObject = stream
                this.video.setAttribute('playsinline', true)
                this.video.setAttribute('webkit-playsinline', true)
                this.video.addEventListener('loadedmetadata', () => {
                  this.video.play()
                  this.sweep()
                })
              })
              .catch((error) => {
                console.error(
                  error.name + ':' + error.message + ',' + error.constraint
                )
              })
          } else if (navigator.getUserMedia) {
            navigator.getUserMedia(
              {
                video: { facingMode: 'environment' }
              },
              (stream) => {
                this.video.srcObject = stream
                this.video.setAttribute('playsinline', true)
                this.video.setAttribute('webkit-playsinline', true)
                this.video.addEventListener('loadedmetadata', () => {
                  this.video.play()
                  this.sweep()
                })
              },
              (error) => {
                console.error(
                  error.name + ':' + error.message + ',' + error.constraint
                )
              }
            )
          } else {
            if (
              navigator.userAgent.toLowerCase().match(/chrome/) &&
                location.origin.indexOf('https://') < 0
            ) {
              /* console.error(
                '获取浏览器录音功能,因安全性问题,需要在localhost 或 127.0.0.1 或 https 下才能获取权限!'
              )*/
              alert('获取浏览器拍照/录音功能,因安全性问题,需要在https 下才能获取权限!')
            } else {
              alert('对不起:未识别到扫描设备!')
            }
          }
        },
        onConfirm() {
          if (this.result) {
            this.dialogVisible = false
            this.$emit('fromChild', this.result)
            this.closeCamera()
          } else {
          alert('请扫描二维码')
          }
        },
        // 关闭摄像头
        closeCamera() {
          const stream = this.video.srcObject
          if (stream) {
            console.log(stream, 'ppppppppppp')
            const tracks = stream.getTracks()
            tracks.forEach(track => {
              track.stop()
            })
            this.video.srcObject = null
          }
        }
      }
    }
    </script>
    
    <style lang="less">
      .reader {
        font-size: 16px;
        margin-bottom: 20px;
        .imgurl {
          margin: 20px;
          text-align: center;
          img {
            margin: 20px;
            padding: 10px;
            border: 1px solid gray;
            border-radius: 8px;
            width: 280px;
            height: 260px;
          }
        }
        .result {
          box-sizing: border-box;
          padding: 10px;
          border: 1px solid gray;
          border-radius: 8px;
          font-size: 16px;
        }
      }
      .sweep {
        position: relative;
        padding: 12px;
        font-size: 18px;
        cursor: pointer;
        color: white;
        background: #42b983;
        border: 1px solid #42b983;
        overflow: hidden;
        input {
          position: absolute;
          font-size: 100px;
          opacity: 0;
        }
        .canvas {
          display: none;
          box-sizing: border-box;
          position: fixed;
          top: 0;
          bottom: 0;
          left: 20px;
        }
      }
    </style>
    
    
    展开全文
  • 运单号码 给扫描按钮的图片绑定一个事件,点击调用摄像头扫码,扫描成功将数值赋给 input 输入框的 value 值。效果如下图: JS 部分(应用): data: { scanCodeMsg: "", }, scanCode: function() { var that = ...

    今天在整一个有关于快递的小程序,快递单号一般比较长,手动录入会很麻烦。

    然后就找了一下,其实微信小程序 API 中自带一个扫码识别的功能。

    wx.scanCode(Object object)

    调起客户端扫码界面进行扫码。

    示例代码:

    // 允许从相机和相册扫码
    wx.scanCode({
      success(res) {
        console.log(res)
      }
    })
    
    // 只允许从相机扫码
    wx.scanCode({
      onlyFromCamera: true,
      success(res) {
        console.log(res)
      }
    })

    WXSS就不贴了

    WXML部分(应用):

    <view class='form-list'>
      <text>运单号码</text>
      <input type='text' value='{{scanCodeMsg}}'></input>
      <image class='scan' bindtap='scanCode' src='/images/scanCode.png' mode='widthFix'></image>
    </view>

    给扫描按钮的图片绑定一个事件,点击调用摄像头扫码,扫描成功将数值赋给 input 输入框的 value 值。效果如下图:

    JS 部分(应用):

    data: {
      scanCodeMsg: "",
    },
    scanCode: function() {
      var that = this;
      wx.scanCode({ //扫描API
        success(res) { //扫描成功
          console.log(res) //输出回调信息
          that.setData({
            scanCodeMsg: res.result
          });
          wx.showToast({
            title: '成功',
            duration: 1000
          })
        }
      })
    },

    参数 Object object

    object.success 回调函数

    参数

    Object res

    转自:https://www.w3h5.com/post/255.html

    展开全文
  • 允许您单独配置,如视频属性:每个摄像头的分辨率和帧速率。如您还可以设置图像的属性:饱和度,亮度,对比度和IP相机。 在预览布局排列多个IP摄像机:如果你的相机安装或其预览有点倾斜?IP相机取景器,你可以调整...
  • 现在二维码使用越来越广泛了,几乎处处可见,并且 公司相关的项目中几乎全部都和二维码扫描有关,所以总结一下自己的使用心路历程,总觉得要做点什么来记录自己的成长,让自己的成长有迹可循,如果恰好能够帮助到你...

    本文同步到简书

    现在二维码使用越来越广泛了,几乎处处可见,并且 公司相关的项目中几乎全部都和二维码扫描有关,所以总结一下自己的使用心路历程,总觉得要做点什么来记录自己的成长,让自己的成长有迹可循,如果恰好能够帮助到你,我当然会很开心啦,如果没帮到,请忽略。。

    废话结束,正文开始

    小白之旅,如有问题 望指正,万分感谢 🙏🙏
    首先推荐几篇

    Android 二维码的扫码功能实现

    二维码ZXING源码分析(一)

    zxing扫描二维码和识别图片二维码及其优化策略

    Android中常用的就是 zxing ,开源项目地址:https://github.com/zxing/zxing。首先我们下载项目到本地,然后加载到自己的工程中,可参考 我的上一片博文 AndroidStudio 导入 Zxing Android 项目,这个是作为库文件导入的,当然我们也可以单独在工程中分出一个包,来实现扫描二维码的功能。

    特别提醒: 如果作为 module 完整导入项目则配置好后就可以运行,如果单独作为一个包,独立出自己需要的内容,需要复制 layout 文件,和资源文件 res–>values 里面的 ids.xml 和 res–>raw 里面的 beep.ogg 文件

    一、了解 ZXing

    zxing Android项目

    ZXing 导入后,所有的内容如上图所示,运行示例代码,发现是横屏用来扫描条形码的,包括识别相册中的二维码,扫描记录,剪切板,生成二维码等功能,我们可以根据需要,分离出自己需要的那一部分,首先了解 ZXing 这个项目中各个部分的作用,然后开始 DELETE 👹操作。

    把 CaptureActivity 作为入口开始分析…
    (PS:不一定正确,是我自己的理解,不过 大概是这样子的,如有失误,后续会修正)

    CaptureActivity: 打开相机并在后台线程进行实际扫描,绘制取景框,并进行图像扫描反馈。

    CameraManager:相机管理类,调用相机 预览,绘制扫描框的具体内容都在这里。相关的相机的配置也在这里设置,例如前后摄像头切换,是否自动聚焦等。在 CaptureActivity 中,CameraManager 在 onResume() 中获取对象,openDriver() 用来打开相机

    CaptureActivityHandler: 处理所有的捕获的状态消息,在 initCamera()中,打开相机后,创建该对象,根据描述,应该是传递消息的, 把需要解码的内容 传递给 然后 把结果返回到 CaptureActivity

    DecodeThread: 处理最困难图像解析工作,包括解析和生成二维码的内容,和 DecodeHandler 搭档

    DecodeHandler: 把扫码结果返回给 CaptureActivityHandler。

    ViewfinderView:自定义的扫描界面,如果想绘制自己想要的扫描效果,可以在这里动手👋

    大致是这样子的,从 CaptureActivity 入手,一点点看,就会明白是怎么回事,写不明白的感觉。大家 也可以看 我这里实现的 DEMO , 里面相应的都给注释了下。Github: https://github.com/ghhf/MyZxing

    二、修改UI, 修改扫描页面

    大致的流程清楚后,首先来最简单的,把扫描的界面绘制成我们想要的样子.

    首先,把屏幕方向改为竖屏,相应地 相机扫描方向也要旋转,
    在 CameraManager 中 getFramingRectInPreview() 修改:

          rect.left = rect.left * cameraResolution.y / screenResolution.x;
          rect.right = rect.right * cameraResolution.y / screenResolution.x;
          rect.top = rect.top * cameraResolution.x / screenResolution.y;
          rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;
    

    然后,在 DecodeHandler 里面 decode() 中添加:

    // 旋转摄像头扫描方向后 处理 可以扫描二维码 也可以扫描条形码
        byte[] rotatedData = new byte[data.length];
        for (int y = 0; y < height; y++) {
          for (int x = 0; x < width; x++)
            rotatedData[x * height + height - y - 1] = data[x + y * width];
        }
        int tmp = width;
        width = height;
        height = tmp;
        data = rotatedData;
    
        PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(data, width, height);
    

    我们想要的其实是一个正方形的扫描框,然后,调整 ViewfinderView 绘制扫描框预览界面,具体的可以在 ViewfinderView 的 onDraw() 方法中实现,

    Rect frame = cameraManager.getFramingRect();
    

    想要绘制正方形,getFramingRect() 获取的预览界面宽高,可以设置成一样的,均使用屏幕的宽来设置

     int width = findDesiredDimensionInRange(screenResolution.x, MIN_FRAME_WIDTH, MAX_FRAME_WIDTH);
          int height = findDesiredDimensionInRange(screenResolution.x, MIN_FRAME_WIDTH, MAX_FRAME_WIDTH);
    //      int height = findDesiredDimensionInRange(screenResolution.y, MIN_FRAME_HEIGHT, MAX_FRAME_HEIGHT);
    

    绘制四个角

     //画扫描框边上的角,总共8个部分
                paint.setColor(getResources().getColor(R.color.result_view));
                canvas.drawRect(frame.left, frame.top, frame.left + ScreenRate, frame.top + CORNER_WIDTH, paint);
                canvas.drawRect(frame.left, frame.top, frame.left + CORNER_WIDTH, frame.top + ScreenRate, paint);
                canvas.drawRect(frame.right - ScreenRate, frame.top, frame.right, frame.top + CORNER_WIDTH, paint);
                canvas.drawRect(frame.right - CORNER_WIDTH, frame.top, frame.right, frame.top + ScreenRate, paint);
                canvas.drawRect(frame.left, frame.bottom - CORNER_WIDTH, frame.left + ScreenRate, frame.bottom, paint);
                canvas.drawRect(frame.left, frame.bottom - ScreenRate, frame.left + CORNER_WIDTH, frame.bottom, paint);
                canvas.drawRect(frame.right - ScreenRate, frame.bottom - CORNER_WIDTH, frame.right, frame.bottom, paint);
                canvas.drawRect(frame.right - CORNER_WIDTH, frame.bottom - ScreenRate, frame.right, frame.bottom, paint);
    
                //绘制中间的线,每次刷新界面,中间的线往下移动SPEEN_DISTANCE
                slideTop += SPEEN_DISTANCE;
                if (slideTop >= frame.bottom) {
                    slideTop = frame.top;
                }
                canvas.drawRect(frame.left + MIDDLE_LINE_PADDING, slideTop - MIDDLE_LINE_WIDTH / 2, frame.right - MIDDLE_LINE_PADDING, slideTop + MIDDLE_LINE_WIDTH / 2, paint);
    
    
                //画扫描框下面的字
                paint.setColor(getResources().getColor(R.color.white));
                paint.setTextSize(TEXT_SIZE * density);
                paint.setAlpha(225);
                paint.setTypeface(Typeface.DEFAULT);
                String text = getResources().getString(R.string.msg_default_status);
                float textWidth = paint.measureText(text);
                canvas.drawText(text, (width - textWidth) / 2, (float) (frame.bottom + (float) TEXT_PADDING_TOP * density), paint);
    

    实现效果图:
    s can

    三、实现扫一扫

    UI 绘制好后,启动 CaptureActivity 调用扫一扫,CaptureActivity 中的 handleDecode() 处理扫描后的结果,把处理好的结果返回,

        public void handleDecode(Result rawResult, Bitmap barcode, float scaleFactor) {
            inactivityTimer.onActivity();
            String result = rawResult.getText();
    
            if (result.equals("")) {
                Toast.makeText(CaptureActivity.this, "Scan Failed!", Toast.LENGTH_SHORT).show();
            } else {
                Log.e(TAG, "扫描的结果" + result);
                // 把扫描结果返回到扫描的页面
                Intent intent = new Intent();
                Bundle bundle = new Bundle();
                bundle.putString("result", result);
                intent.putExtras(bundle);
                setResult(RESULT_OK, intent);
            }
            CaptureActivity.this.finish();
        }
    

    四、添加切换前后摄像头

    扫描二维码调用的相机是系统相机,如果手机本身支持前后摄像头的话(废话,现在还有不支持前置摄像头的手机吗,我要不能自拍的手机干嘛。。。),应该都没有问题,主要是切换下前后摄像头就可以了。所以呢,主要看调用相机部分,camera -> open 下 OpenCameraInterface 主要是用来处理相机相关的,所以看下,发现

      while (cameraId < numCameras) {
            Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
            Camera.getCameraInfo(cameraId, cameraInfo);
            if (CameraFacing.values()[cameraInfo.facing] == CameraFacing.BACK) {
              break;
            }
            cameraId++;
          }
    

    CameraFacing.BACK,当为后置摄像头时返回了当前相机,也就是,默认扫一扫仅仅支持后置扫一扫,这里我们改为支持前后摄像头,根据摄像头传递过来的参数进行修改,open() 打开相机的方法中添加一个参数,用来判断是前置摄像头还是后置摄像头

    public static OpenCamera open(int cameraId, CameraFacing cf) {
    
            int numCameras = Camera.getNumberOfCameras();
            if (numCameras == 0) {
                Log.w(TAG, "No cameras!");
                return null;
            }
            if (cameraId >= numCameras) {
                Log.w(TAG, "Requested camera does not exist: " + cameraId);
                return null;
            }
    
            if (cameraId <= NO_REQUESTED_CAMERA) {
                cameraId = 0;
    
                while (cameraId < numCameras) {
                    Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
                    Camera.getCameraInfo(cameraId, cameraInfo);
    
                    if(cf == CameraFacing.BACK){
                        if (CameraFacing.values()[cameraInfo.facing] == cf.BACK) {
                            break;
                        }
                    }
    
                    if(cf == CameraFacing.FRONT){
                        if (CameraFacing.values()[cameraInfo.facing] == cf.FRONT) {
                            break;
                        }
                    }
                    cameraId++;
                }
    
                if (cameraId == numCameras) {
                    Log.i(TAG, "No camera facing " + CameraFacing.BACK + "; returning camera #0");
                    cameraId = 0;
                }
            }
    
            Log.i(TAG, "Opening camera #" + cameraId);
            Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
            Camera.getCameraInfo(cameraId, cameraInfo);
            Camera camera = Camera.open(cameraId);
            if (camera == null) {
                return null;
            }
            return new OpenCamera(cameraId,
                    camera,
                    CameraFacing.values()[cameraInfo.facing],
                    cameraInfo.orientation);
        }
    

    然后发现 其实调用 OpenCameraInterface里面 open()方法的是 CameraManageropenDriver(),也就是说需要在 openDriver()里面传递参数,再往外找,发现CaptureActivityinitCamera()是打开相机,设置参数的地方,所以在这里把设置前后摄像头的参数传递过去,

     private void initCamera(SurfaceHolder surfaceHolder) {
            if (surfaceHolder == null) {
                throw new IllegalStateException("No SurfaceHolder provide");
            }
            if (cameraManager.isOpen()) {
                Log.w(TAG, "initCamera() while already open -- late SurfaceView callback?");
    
                // 如果相机已经打开 则关闭当前相机 重建一个 切换摄像头,,如果不需要切换前置摄像头 则这里直接return
                handler = null;
                cameraManager.closeDriver();
    
    //            return;
            }
            try {
                cameraManager.openDriver(surfaceHolder, cfbf);
                // Creating the handler starts the preview, which can also throw a RuntimeException.
                if (handler == null) {
                    handler = new CaptureActivityHandler(this, decodeFormats, decodeHints, characterSet, cameraManager);
                }
    //            decodeOrStoreSavedBitmap(null, null);
            } catch (IOException ioe) {
                Log.w(TAG, ioe);
                displayFrameworkBugMessageAndExit();
            } catch (RuntimeException e) {
                // Barcode Scanner has seen crashes in the wild of this variety:
                // java.?lang.?RuntimeException: Fail to connect to camera service
                Log.w(TAG, "Unexpected error initializing camera", e);
                displayFrameworkBugMessageAndExit();
            }
        }
    

    这样就会调用相应的前置或后置摄像头。

    BUT 修改后,发现 报错了,前后摄像头不能切换 直接卡死 !!

    Error:

     Unexpected exception while focusing
     Camera is being used after Camera.release() was called
    

    看报错信息大致是说,相机对象已经被释放了,但是还在使用,嗯,想想自己干了什么会这样,对,cameraManager.closeDriver();,在切换前后摄像头时,当相机是打开的时候就先释放,重新创建一个对象,所以在释放的时候,不能继续使用相机,在closeDriver()添加,相机释放之前,先停止预览。

     camera.getCamera().setPreviewCallback(null);
     camera.getCamera().lock();
     stopPreview();
    

    在capture.xml中添加一个组件,用来切换相机前后摄像头。

    实现效果:

    前置摄像头扫一扫

    五、生成二维码

    生成二维码部分的功能主要在QRCodeEncoder.java里面,这里仅仅生成二维码,对于二维码内容的格式使用默认的,重写构造函数只传入我们需要的参数

     public QRCodeEncoder(Context activity, int dimension, String contnt) {
        this.activity = activity;
        this.dimension = dimension; // 生成二维码图片的尺寸
        this.contents = contnt; // 生成的二维码的内容
      }
     public Bitmap encodeAsBitmap() throws WriterException {
    
        Log.e("二维码图片参数",String.valueOf(dimension));
    
        String contentsToEncode = contents;
        if (contentsToEncode == null) {
          return null;
        }
        
        Map<EncodeHintType,Object> hints = new HashMap<>();
    //    String encoding = guessAppropriateEncoding(contentsToEncode);
    //    if (encoding != null) {
    //      hints = new EnumMap<>(EncodeHintType.class);
    //      hints.put(EncodeHintType.CHARACTER_SET, encoding);
    //    }
    
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
    
        BitMatrix result;
        try {
          format = BarcodeFormat.QR_CODE;
    
          Log.e(TAG,"contentsToEncode == " + contentsToEncode);
          result = new MultiFormatWriter().encode(contentsToEncode, format, dimension, dimension, hints);
    
          int width = result.getWidth();
          int height = result.getHeight();
          int[] pixels = new int[width * height];
          for (int y = 0; y < height; y++) {
            int offset = y * width;
            for (int x = 0; x < width; x++) {
              pixels[offset + x] = result.get(x, y) ? BLACK : WHITE;
            }
          }
    
          Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
          bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
    
          return bitmap;
    
        } catch (IllegalArgumentException iae) {
          Log.e(TAG,"Error == " + iae.toString());
          // Unsupported format
          return null;
        }
    
      }
    

    调用encodeAsBitmap(),就可以生成Bitmap对象。
    效果:输入内容 点击生成二维码即可生成二维码
    在这里插入图片描述

    这里仅仅把zxing项目中自己需要的功能提取出来,主要还是要有耐心,看不懂就多看几遍对我来说还是有效果的啊,哈哈哈,当然,自己也去找了很多的资料帮助自己理解,感谢你们。

    惯例,最后送给自己一句话:凡事往简单处想,往认真处行

    展开全文
  • 扫码是通过jsQR库实现的,在vue环境也可以实现调用摄像头进行扫描二维码并且返回二维码链接的一个操作。示例是一个html和一个jsQR.js两个文件,想了解vue环境的代码怎么写的可以去看看我的写的文章。文章链接:...
  • <p>I have this code that scans and decode qr image with the help of this source code <a href="https://github.com/khanamiryan/php-qrcode-detector-decoder" rel="nofollow noreferrer">...
  • HTML5 调用手机摄像头扫描二维码

    万次阅读 2017-04-01 13:32:21
    最近有个项目需要使用H5调用手机摄像头扫描二维码斌且识别。(很奇葩的需求) 百度了下找到了这个api: 旧版:(目前只有UC浏览器支持,其他的手机浏览器一律没有反应) ... 新版:(目前只有火狐浏览器手机版和谷歌...

    最近有个项目需要使用H5调用手机摄像头扫描二维码斌且识别。(很奇葩的需求)

    百度了下找到了这个api:

    旧版:(目前只有UC浏览器支持,其他的手机浏览器一律没有反应)

    https://developer.mozilla.org/zh-CN/docs/Web/API/Navigator/getUserMedia

    新版:(目前只有火狐浏览器手机版谷歌浏览器桌面版支持支持)

    https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getUserMedia


    这两天折腾总算是把功能实现了,但是!!根本就不能用啊好不好!!

    为什么呢?因为旧版的API的后置摄像头根本就不能对焦!!!前置摄象头可以对焦,但是没什么卵用啊,谁会用前置摄像头去扫描。但是鉴于鼓捣了这么久还是贴上代码吧。希望新版api能被兼容QAQ


    我的实现思路是这样的,用唤起摄像头的api唤起摄像头,然后把视频流写到video标签,然后利用video的timeupdate事件每一秒截取一帧图像画到canvas画布上,再用js的二维码解析库解析二维码。


    js二维码解析库的地址:

    https://github.com/LazarSoft/jsqrcode


    以下是我的代码:


    <!DOCTYPE html>  
    <html>  
    <head>  
    <meta charset="UTF-8">  
    <title>Insert title here</title>
    
        <script type="text/javascript" src="grid.js"></script>
        <script type="text/javascript" src="version.js"></script>
        <script type="text/javascript" src="detector.js"></script>
        <script type="text/javascript" src="formatinf.js"></script>
        <script type="text/javascript" src="errorlevel.js"></script>
        <script type="text/javascript" src="bitmat.js"></script>
        <script type="text/javascript" src="datablock.js"></script>
        <script type="text/javascript" src="bmparser.js"></script>
        <script type="text/javascript" src="datamask.js"></script>
        <script type="text/javascript" src="rsdecoder.js"></script>
        <script type="text/javascript" src="gf256poly.js"></script>
        <script type="text/javascript" src="gf256.js"></script>
        <script type="text/javascript" src="decoder.js"></script>
        <script type="text/javascript" src="qrcode.js"></script>
        <script type="text/javascript" src="findpat.js"></script>
        <script type="text/javascript" src="alignpat.js"></script>
        <script type="text/javascript" src="databr.js"></script>
    
    </head>  
    <body>  
    <video id="video" autoplay=""style='width:100%;height:100%'></video>
    <canvas id="canvas" style='display:none' width="400" height="400"></canvas>
    
    <div id='pic_box'></div>
    <div id='text_box'></div>
    
    <script type="text/javascript">
    
        function writeObj(obj){
            var description = "";
            for(var i in obj){
                var property=obj[i];
                description+=i+" = "+property+"\n";
            }
            alert(description);
        }
    
        /*//Uc前置摄像头扫描成功(因为后置摄像头不能对焦)
        var exArray = []; //存储设备源ID
        MediaStreamTrack.getSources(function (sourceInfos) {
            for (var i = 0; i < sourceInfos.length; i++) {
                var sourceInfo = sourceInfos[i];
                //这里会遍历audio,video,所以要加以区分
                if (sourceInfo.kind === 'video') {
                    exArray.push(sourceInfo.id);
                }
            }
    
            var getUserMedia = (navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia);
            getUserMedia.call(navigator, {
                'video': {
                    'optional': [{
                        'sourceId': exArray[0] //0为前置摄像头,1为后置
                    }]
                },
            }, function(localMediaStream) {
                var video = document.getElementById('video');
                video.src = window.URL.createObjectURL(localMediaStream);
                video.play();
                //每秒用canvas绘制一副图后用二维码解析库解析
                video.addEventListener("timeupdate", checkCode);
            }, function(e) {
                console.log('Reeeejected!', e);
            });
    
        });
        count = 0;
        function checkCode() {
            canvas.getContext('2d').drawImage(video, 0, 0, 400, 400);
            qrcode.decode(canvas.toDataURL("image/png"));
            qrcode.callback = function (data) {
                if (data == 'error decoding QR Code') {
                    document.getElementById('text_box').innerText = '第' + count + '次:' + data;
                    count++;
                } else {
                    video.removeEventListener('timeupdate', checkCode);
                    alert(data);
                    //location.href = data;
                }
            }
        }*/
    
    
        //谷歌浏览器(电脑前置摄像头)扫描成功
        var count = 0;
        var video = document.getElementById('video');
        var canvas = document.getElementById('canvas');
        navigator.mediaDevices.getUserMedia({
            video: true
        })
        .then(function(stream){
            video.src = window.URL.createObjectURL(stream);
            video.play();
            //每秒用canvas绘制一副图后用二维码解析库解析
            video.addEventListener("timeupdate", checkCode);
        })
        .catch(function(){
    
        });
    
        function checkCode(){
            canvas.getContext('2d').drawImage(video, 0, 0, 400, 400);
            qrcode.decode(canvas.toDataURL("image/png"));
            qrcode.callback = function(data){
                if(data == 'error decoding QR Code'){
                    document.getElementById('text_box').innerText = '第' + count + '次:' + data;
                    count ++;
                }else{
                    video.removeEventListener('timeupdate', checkCode);
                    alert(data);
                    //location.href = data;
                }
            }
        }
    
    </script>  
      
    </body>  
    </html>  

    结语,基本没什么实用价值

    展开全文
  • C#调用本地摄像头进行二维码扫描,使用ZXing控件库进行解码,使用AForge调用摄像头进行拍照。
  • android 前置摄像头扫描二维码

    万次阅读 2016-11-02 14:53:43
    android 前置摄像头扫描二维码 其实前置摄像头与后置摄像头的二维码扫描是差不多的,同样也是用到zxing这个开源类库,把网上的二维码扫描的例子的下载下来,然后去修改一下调起的摄像头就可以了,也就是把原本是后置...
  • 网页调用摄像头实现二维码扫描功能,很强大,,,网上搜的很多H5调用MUI的二维码扫描功能都用不了,不支持,。这个很强大,实现了网页调用摄像头进行二维码扫描功能,帅!
  • electron vue 调用摄像头扫描二维码

    千次阅读 2020-02-26 22:13:48
    开启扫描 // eslint-disable-next-line no-unused-vars import adapter from 'webrtc-adapter' // WebRTC适配器 只需要引入就ok import jsQR from 'jsqr' /** * jsqr demo */ export default { data: () =...
  • html+js调用手机摄像头扫描二维码(生产勿用!)

    万次阅读 热门讨论 2019-01-21 17:28:50
    在app项目中实现HTML5的扫描二维码,网上的搜了一大推,但是实际使用的时候发现能直接上手的并不多,所以自己百度,然后提炼了一些,下面直接上代码。 在线示例 注意: 1.安卓(5.1)有些手机中测试正常,iOS暂时不行...
  • 思路二:调用摄像头(video动态识别)+ 条形码或二维码识别js支持库 调用手机原生摄像头 动态识别 用相关支持js库 解析 二维码 条形码 2-1.方案四:video+ zxing识别库,success,可识别 条形码 可识别二维码...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,877
精华内容 9,550
关键字:

摄像头扫描