如何在Android中使用ZXing扫描倒QR码

时间:2016-12-12 16:10:18

标签: android c++ qr-code zxing

我目前在检测倒QR码时遇到问题。 问题是它能够很好地检测到正常的QR码但不能反转QR码。

我试图在google和stackoverflow上找到解决方案,但大多数问题没有可接受的答案。

我看到这篇文章,我认为这可能会有所帮助,但我不知道如何编辑c ++文件。 Invert pixels - zxing

这是我的代码。

setContentView(R.layout.activity_simple_scanner);
setupToolbar();
ViewGroup contentFrame = (ViewGroup) findViewById(R.id.content_frame);
mScannerView = new ZBarScannerView(this);
contentFrame.addView(mScannerView);

这是一个示例倒置QR码imgae的链接。 http://prntscr.com/dijmc8

有谁知道解决方案?

2 个答案:

答案 0 :(得分:0)

查看您的图片并在Play商店中尝试使用ZXing失败。

我所能建议的只是追踪ZXing代码,寻找它处理相机帧的位置。请注意,图像为YUV格式。 (在此描述:How to render Android's YUV-NV21 camera image on the background in libgdx with OpenGLES 2.0 in real-time?

你必须尝试看看需要什么样的相机输入着色来获得正确的对比度才能让ZXing检测到(或者即使它只是ZXing正在搜索的特定'平面')。此时,您正在使用OpenGL ES 2.0着色器语言或RenderScript或您自己的JNI C / C ++代码进行实时摄像机图像过滤,以提高性能。有关一般详细信息,请参阅此网站:http://www.bigflake.com/mediacodec/和Grafika项目https://github.com/google/grafika - 特别是CameraCaptureActivity

补充阅读: Android: how to display camera preview with callback?

答案 1 :(得分:0)

如果使用相机条形码扫描仪。请以此更新您的组件代码。

从“ @ zxing / library”导入{BarcodeFormat,HTMLCanvasElementLuminanceSource};

并在ngOnInit()中覆盖此HTMLCanvasElementLuminanceSource.makeBufferFromCanvasImageData函数

HTMLCanvasElementLuminanceSource.makeBufferFromCanvasImageData = function (canvas) {
      var imageData = canvas.getContext('2d').getImageData(0, 0, canvas.width, canvas.height);
      if(localStorage.inverted.toString()==="true"){
        
        
        for (var i = 0; i < imageData.data.length; i += 4) {
          var r = imageData.data[i]; // Red color lies between 0 and 255
          var g = imageData.data[i + 1]; // Green color lies between 0 and 255
          var b = imageData.data[i + 2]; // Blue color lies between 0 and 255
          var a = imageData.data[i + 3]; // Transparency lies between 0 and 255
  
          var invertedRed = 255 - r;
          var invertedGreen = 255 - g;
          var invertedBlue = 255 - b;
  
          imageData.data[i] = invertedRed;
          imageData.data[i + 1] = invertedGreen;
          imageData.data[i + 2] = invertedBlue;
        }
      }
     
      return HTMLCanvasElementLuminanceSource.toGrayscaleBuffer(imageData.data, canvas.width, canvas.height);
  };

将toGrayscaleBuffer的导出类型从私有更新为私有。