DEV Community

Cover image for QR Code Generator + Download QR as Image
developedbyjk
developedbyjk

Posted on

7

QR Code Generator + Download QR as Image

🙋‍♂️Hello Friends!

👨‍💻So I tried building QR code Generator from input link with simple API And added the feature to Download That QR Code & Yeah🥵 faced a lot of bugs dealing with two different APIs but finally Made it🤩

Let me show you how simple it is!😉
(full code below the article)


📌Step 1
👉 We will need an input to paste our URL and a button to do work with that input

<input type="text" id="input"/>
<button onclick="generate()">Generate</button>
Enter fullscreen mode Exit fullscreen mode

👉we added generate function that will trigger JavaScript
🤾‍♂️But we need to show out output so we will create an an image


📌Step 2

\\create image element
let img = document.createElement("img");

\\select the div from html
let qr = document.querySelector(".qr-code");

\\ stick the generated image to html div
qr.appendChild(img);
Enter fullscreen mode Exit fullscreen mode

👉Okay so now 🏖
Input and button - Ready ✅
div to get output - Ready ✅


📌Step 3
👉The Third and main step is to add JavaScript code to generate QR

🚦Let get the input value from input tab

function generate(){
    let input = document.getElementById("input");
    }
Enter fullscreen mode Exit fullscreen mode

👉Next we will check if the value is inserted or not before clicking the generate button 🎯

The code will only run if there is value in input 😉

if yes!🤩
then we will search the qr img by API:🤓

👉we will use template literal to Pass Value of input that we got


https://api.qrserver.com/v1/create-qr-code/?size=180x180&data=${input.value}

👉And Boom💥 The API will do its work😎

if(input.value){
        img.src = `https://api.qrserver.com/v1/
        create-qr-code/?size=180x180&data=${input.value}`
};

Enter fullscreen mode Exit fullscreen mode

Now Let's Download Our QR 😍

👉To download our image we will use Another API FileSaver.js

📌Step 1
👉Adding the Cdn in Head of Html:

 <script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.0/FileSaver.min.js" integrity="sha512-csNcFYJniKjJxRWRV1R7fvnXrycHP6qDR21mgz1ZP55xY5d+aHLfo9/FcGDQLfn2IfngbAHd8LdfsagcCqgTcQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
Enter fullscreen mode Exit fullscreen mode

👉Now Lets Create Download Button :🎨

<button id="mybutton" >Download</button>
Enter fullscreen mode Exit fullscreen mode

And👀

//get the html button
let btnDownload = document.querySelector('#mybutton');
//get the html image
let imgdwn = document.querySelector('img');
Enter fullscreen mode Exit fullscreen mode

📌Step 2

👉Now Add a Event Listener that work when we click download button
So when we click it:🧐

-🐠first get the img src and set in imagePath ✅

btnDownload.addEventListener('click', () => {
//getting the src of image
    let imagePath = imgdwn.getAttribute('src');

});
Enter fullscreen mode Exit fullscreen mode

-🦐second get the img name from the url✅
eg : https://httpbin.org/image get the >>image and add + '.jpg' at end

btnDownload.addEventListener('click', () => {
//getting the src of image
    let imagePath = imgdwn.getAttribute('src');

//image format
    let fileName = getFileName(imagePath);

 //eg :saveAs("https://httpbin.org/image", "image.jpg"); 
    saveAs(imagePath, fileName);

});


Enter fullscreen mode Exit fullscreen mode

🧐so it will be image.jpg from the url to do that we will create getFileName(imagePath) Function

👉after getting the name of image (eg: image.jpg) from function
we will pass into saveAs(imagePath, fileName); 😀

function getFileName(str) {
//search '=' from url starting from end and give the output
    let gotstr = str.substring(str.lastIndexOf('=') + 1 );

    let format = ".jpg";
// return the format ie image.jpg
    return  gotstr.concat(format);
}
Enter fullscreen mode Exit fullscreen mode

Congratulation🎉✨
You Successfully🏆 Created a QR code Generator 🎀 and with Download Button😍

Full Code Below 👇

*📌 HTML 📙 *

<!DOCTYPE html>
<html>
<head>

<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.0/FileSaver.min.js" integrity="sha512-csNcFYJniKjJxRWRV1R7fvnXrycHP6qDR21mgz1ZP55xY5d+aHLfo9/FcGDQLfn2IfngbAHd8LdfsagcCqgTcQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

</head>
<body>
    <div class="container">

            <div class="input-container">
                <input type="text" id="input" placeholder="Enter 
                 Url" autocomplete="off"/>
                <button onclick="generate()">Generate</button>
            </div>

        <div class="qr-code"></div>
        <button id="maindwnbtn" ><a href="#" id="mybutton" 
        download="qr">Download</a></button>

        </div>
<a href="linktr.ee/developedbyjk">@developedbyjk</a>
</body>
</html>
Enter fullscreen mode Exit fullscreen mode

*📌 CSS - if you want 😉 📗 *

@import url('https://fonts.googleapis.com/css2?family=Space+Mono&display=swap');
body{
    font-family: 'Space Mono', monospace;
    background-color: aliceblue;
}
.container{
    max-width: 400px;
    margin: 10%;
    max-height: 500px;
    padding: .2rem;
    display: flex;
    flex-direction: column;
    justify-content: space-evenly;
    background-color:aliceblue;
}
.input-container{
    display: flex;
    flex-direction: column;
}
.input-container input{
    padding: 12px;
    outline: none;
    border-radius: 5px;
    border: 2px dashed #c7c7c7;
      font-family: 'Space Mono', monospace;
}
.qr-code{
    margin-top: 100px;
    height: 200px;
    width: 200px;
     border: 2px dashed #c7c7c7;
}

.input-container button{
    padding: 0.5rem;
    height: 40px;
    color: #fff;
    font-size: 1rem;
    margin-top: .5rem;
    outline: none;
    border-radius: 90px;
    border: none;
    background-color: #332fd0;
    cursor: pointer;
      font-family: 'Space Mono', monospace;
}


#maindwnbtn{
        padding: 0.5rem;
    height: 40px;
    font-size: 1rem;
    margin-top: 80%;
    outline: none;
    border-radius: 90px;
    border: none;
    background-color: #332fd0;
    cursor: pointer;

}


#maindwnbtn a{
    color: #fff;
    text-decoration:none;
    font-family: 'Space Mono', monospace;
}
.qr-code{
    width: 100%;
    height: 180px;
    text-align: center;
}
Enter fullscreen mode Exit fullscreen mode

*📌 JavaScript 📗 *

let img = document.createElement("img");
let qr = document.querySelector(".qr-code");
qr.appendChild(img);
function generate(){
    let input = document.getElementById("input");
    if(input.value){
        input.style.borderColor = "#c7c7c7";
        img.src = `https://api.qrserver.com/v1/create-qr-code/?size=180x180&data=${input.value}`;

    }
    else{
        input.style.borderColor="red";
        return false;
    }
    input.value = "";


}


let btnDownload = document.querySelector('#mybutton');
let imgdwn = document.querySelector('img');



btnDownload.addEventListener('click', () => {
    let imagePath = imgdwn.getAttribute('src');
    let fileName = getFileName(imagePath);
    saveAs(imagePath, fileName);
});

function getFileName(str) {
    let gotstr = str.substring(str.lastIndexOf('=') + 1 );
    let format = ".jpg";
    return  gotstr.concat(format);
}


Enter fullscreen mode Exit fullscreen mode

Wait 😳
You reached so Below 🤯 I can't Believe it

You seem great Diver 😍😉

So Hi👋 My diver Friend👨
Myself JK 👨‍💻
I share Stuff Related to Web Design & Development
If you like this😄

I'm Sure you'll Love My Instagram Page Where I share the same,but with Visual Taste.🤝😎👀

Hope we meet There😉🎀🏝

Happy Coding 💪✨🎉

My All Links linktr.ee/developedbyjk

Sentry blog image

How I fixed 20 seconds of lag for every user in just 20 minutes.

Our AI agent was running 10-20 seconds slower than it should, impacting both our own developers and our early adopters. See how I used Sentry Profiling to fix it in record time.

Read more

Top comments (0)

Cloudinary image

Optimize, customize, deliver, manage and analyze your images.

Remove background in all your web images at the same time, use outpainting to expand images with matching content, remove objects via open-set object detection and fill, recolor, crop, resize... Discover these and hundreds more ways to manage your web images and videos on a scale.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay