Learn how to decode a QRCode from an image (no camera) using pure Javascript.

How to decode a QR code from an image with Javascript

A QR code is short and sweet (besides quite useful) for a quick response (they can be read quickly by a smartphone). Yep, they're normally scanned by someone with a smartphone ,but thanks to jsqrcode, we can achieve the scanning process without a camera and decode the information from plain (PNG or JPEG) images (in base64 format to be more specific and to increase accuracy) in case you ever need such a feature in any of your crazy company (or own) projects.

In this article, you'll learn how to scan a QR Code from its base64 value easily using jsqrcode.

Requirements

To achieve our goal, we are going to depend on the jsqrcode library. This library is a JavaScript QRCode reader implementation for HTML5 created by Lazar Laszlo. You can download (or clone) its source code in the official repository in Github here. The source code itself is based in 17 different JS files (that needs obviously to be loaded in your html document using the script tag).

Implementation

Basically, to use the library you'll need to use 2 lines, set a callback that receives the decoded data and provide the base64 image as first parameter in the decode function:

// set the callback that receives the decoded content as the tasks is async
qrcode.callback = function(decodedDATA){
      alert(decodedDATA);
};

// Start decoding the base64 string
qrcode.decode("data:image/png;.......");

The following snippet, shows the most basic usage in a simple html snippet (feel free to download and test it locally). The imageURI variable contains a QRCode image (in this case PNG but it can be JPG) in base64 and it will be given as first parameter in our custom function decodeImageFromBase64.

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Decode QRCode from image using javascript</title>
    </head>
    <body>
        <input type="button" id="action" value="Decode"/>
        <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>
        <script>
            // A qrcode with "ourcodeworld.com" as value in format base64 encoded
            var imageURI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASIAAAEiAQMAAABncE31AAAABlBMVEX///8AAABVwtN+AAABA0lEQVRoge3ZUQ6CMAzG8SYcwCNx9R2JA5jU0a6ARKIP60z0/z0wZD+fmm1siBBCCPmfaMu93t/sEk8KKlv5jwrq3VT7jO4dqEy1lsT65mVS92vBUAOVKupbKmYm1DhljffpB/MXqp/aVmQfIuXNuo3qp46p4KIHlaFiTKzXRdrS4GszKlnJHCPBhkgF2z9RyWqvkNWlUdWrOqL6qZiP2kuoVWivGipT+cAosfsNOqHy1cm34txOuwBUhtKW2Hf52Zu8XLdRnVWxZtt3+duQ3gU1QD2d+kSFBDVUFX8ytZcj1Eh1OHMWQQ1Q1kSF2hb4ev5CdVTHFVl1/86FSleEEEJ+PQ/ANYzwx13NHQAAAABJRU5ErkJggg==";

            /**
             * The function decodeImageFromBase64 expects as first parameter a base64 string from a QRCode.
             * As second parameter the callback that expects the data from the QRCode as first parameter.
             */
            function decodeImageFromBase64(data, callback){
                // set callback
                qrcode.callback = callback;
                // Start decoding
                qrcode.decode(data)
            }

            // On button click, decode the qrCode from the base64 format.
            document.getElementById("action").addEventListener('click',function(){
                decodeImageFromBase64(imageURI,function(decodedInformation){
                    alert(decodedInformation);
                });
            },false);
        </script>
    </body>
</html>

Is up to you how to convert an image (whatever the source is i.e your own website from an url or a local file) into its base64 format to be processed by the jsqrcode library.

Note that you get to work this scanner code with the getUserMedia API in order to create a live QR Code scanner with your webcamera, however that's another story and you can see a working example in the official demo website of the library.

Have fun !


Senior Software Engineer at Software Medico. Interested in programming since he was 14 years old, Carlos is a self-taught programmer and founder and author of most of the articles at Our Code World.

Sponsors