从数据 URI 解码二维码

decode QR code from data URI

我尝试从数据 uri 中解码二维码:

var dataUri = 'data:image/gif;base64,R0lGODdh9gD2AIAAAAAAAP///ywAAAAA9gD2AAAC...';
decodeQrCode(dataUri, cb);

我已经试过了qrcode-decoder-js (example with mocha test)

function decodeQrCode(dataUri, cb) {
  qrcode.callback = cb;
  qrcode.decode(dataUri);
}
// error decoding QR Code

qcode-decoder (example with mocha test)

function decodeQrCode(dataUri, cb) {
  var qr = new QCodeDecoder();
  var img = document.createElement('img');
  img.setAttribute('src', dataUri);
  qr.decodeFromImage(img, cb);
}
// Error decoding QR Code from Image

但在我看来,两者本身都不支持数据 URI。

如何从数据 URI 中解码二维码?

您遇到的错误是您的二维码方向不正确。

这是旋转 90 度后的结果:

window.onload = function() {
  var img = document.querySelector('img');
  var canvas = document.createElement('canvas');
  canvas.width = img.width;
  canvas.height = img.height;
  var ctx = canvas.getContext('2d');
  // rotate by 90 deg
  ctx.rotate(Math.PI);
  ctx.translate(-img.width, -img.height);
  ctx.drawImage(img, 0, 0);
  // decode
  QCodeDecoder().decodeFromImage(canvas.toDataURL(), function(err, res){
    document.body.appendChild(document.createTextNode(res||err))
    });
  
}
*{vertical-align : top}
<script src="https://rawgit.com/cirocosta/qcode-decoder/master/build/qcode-decoder.min.js"></script>
<img id="qr-code" src="data:image/gif;base64,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"
alt="">