Skip to main content

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 !

Comments

Popular posts from this blog

4 Ways to Communicate Across Browser Tabs in Realtime

1. Local Storage Events You might have already used LocalStorage, which is accessible across Tabs within the same application origin. But do you know that it also supports events? You can use this feature to communicate across Browser Tabs, where other Tabs will receive the event once the storage is updated. For example, let’s say in one Tab, we execute the following JavaScript code. window.localStorage.setItem("loggedIn", "true"); The other Tabs which listen to the event will receive it, as shown below. window.addEventListener('storage', (event) => { if (event.storageArea != localStorage) return; if (event.key === 'loggedIn') { // Do something with event.newValue } }); 2. Broadcast Channel API The Broadcast Channel API allows communication between Tabs, Windows, Frames, Iframes, and  Web Workers . One Tab can create and post to a channel as follows. const channel = new BroadcastChannel('app-data'); channel.postMessage(data); And oth...

Certbot SSL configuration in ubuntu

  Introduction Let’s Encrypt is a Certificate Authority (CA) that provides an easy way to obtain and install free  TLS/SSL certificates , thereby enabling encrypted HTTPS on web servers. It simplifies the process by providing a software client, Certbot, that attempts to automate most (if not all) of the required steps. Currently, the entire process of obtaining and installing a certificate is fully automated on both Apache and Nginx. In this tutorial, you will use Certbot to obtain a free SSL certificate for Apache on Ubuntu 18.04 and set up your certificate to renew automatically. This tutorial will use a separate Apache virtual host file instead of the default configuration file.  We recommend  creating new Apache virtual host files for each domain because it helps to avoid common mistakes and maintains the default files as a fallback configuration. Prerequisites To follow this tutorial, you will need: One Ubuntu 18.04 server set up by following this  initial ...

Working with Node.js streams

  Introduction Streams are one of the major features that most Node.js applications rely on, especially when handling HTTP requests, reading/writing files, and making socket communications. Streams are very predictable since we can always expect data, error, and end events when using streams. This article will teach Node developers how to use streams to efficiently handle large amounts of data. This is a typical real-world challenge faced by Node developers when they have to deal with a large data source, and it may not be feasible to process this data all at once. This article will cover the following topics: Types of streams When to adopt Node.js streams Batching Composing streams in Node.js Transforming data with transform streams Piping streams Error handling Node.js streams Types of streams The following are four main types of streams in Node.js: Readable streams: The readable stream is responsible for reading data from a source file Writable streams: The writable stream is re...