Interactive QR tool

JavaScript QR Code Generator With Logo

Choose what the code carries, drop a logo into the middle, and watch a coverage meter tell you whether the overlay is still inside what the error-correction level can rebuild. Then export a PNG or an SVG at print size — or turn a CSV into 200 labels on an A4 sheet. Nothing here is uploaded; the payload formats and the escaping rules behind them are documented on the QR code generator.

1 · What should it carry?

The exact string going into the symbol
https://jsgenerator.com

Line breaks are shown as \r\n because a vCard joined with a bare LF imports as an empty contact on some phones. Why escaping matters →

2 · The logo

3 · Output

Export size

Live preview

level H · —
Bytes
23
Version
—
Module at print
—

How much of the code is covered?

—

Drop a logo to measure it. Level H restores about 30% of the symbol — the bar fills as your overlay eats into that.

Coverage is measured against the symbol area at the logo size you set (the quiet zone is not counted, so the number is the pessimistic one). It is an estimate: no checker replaces scanning the printed proof on two phones.

Contrast 17.7:1 — below 4.5:1 phones start failing, whatever the data says.

Nothing is uploaded

The symbol is computed in this tab from the text you typed; the logo is read by your browser into a data URL and embedded in the file you download. There is no request to a server anywhere in this tool, which is also why it works with a hotel Wi-Fi password you have no business typing into anyone’s form.

Batch: a list in, a label sheet out

Paste a column or drop a CSV. Each row becomes one label on an A4 sheet you can print and cut — up to 200 at a time, all rendered locally.

One file per page, one caption per label, and a manifest that records which row produced which code — so a misprint two weeks from now can be traced to a line in your CSV.

Why high correction matters

A logo covers modules in the centre of the code. Error correction is what lets a scanner rebuild what is hidden, so the overlay and the payload are competing for the same budget — the meter above shows the trade in real time.

Private by design

The text, the logo file and the final composition all stay in the browser. A Wi-Fi password or a contact list never becomes someone else's request body, which is also why there is no rate limit or account here.

Logo file recommendations

Transparent PNG works best. Start with a square asset of at least 200 by 200 pixels, keep the mark simple, and remember that whatever you upload is embedded into the SVG you download — so it needs to be yours.

Export sizes, and what they are good for

Pixel size only matters if you are printing. What decides whether a code works is the printed edge of one module, so these are the same four exports with their 300 dpi print size attached.

ExportPrints atModule edge (v3 symbol)Use it for
320 px27 mm at 300 dpi2.1 mmscreen, chat, docs, an email signature
800 px68 mm at 300 dpi5.2 mmsocial posts, slide decks, a PDF
1200 px102 mm at 300 dpi7.9 mmA6 flyer, table tent, packaging insert
3000 px254 mm at 300 dpi19.5 mmA4 poster, vinyl, a projected screen

A v3 symbol is 29 modules across including its quiet zone. At 27 mm that is 2.1 mm per module — comfortable. A 73-module vCard with a note at the same 27 mm lands at 0.8 mm per module, which is right at the limit. That is why this page tells you the module edge rather than the pixel count: the pixel count is the same for both, and only one of them will scan off a wall.

How to use this QR code generator with logo

These are the same steps reflected in the page schema so Google and users see a clear, tool-first workflow.

1

Pick what the code carries

Choose URL, text, Wi-Fi, vCard, email, SMS, or paste a raw payload. The exact string that goes into the symbol is shown under a disclosure so you can check it before printing anything.

2

Upload a logo

Drop a square logo. It is read locally into a data URL and composited into the centre of the symbol — and into the SVG, so the downloaded file needs no companion asset.

3

Watch the coverage meter

Logo size and plate padding are measured against the symbol area and compared with what your error-correction level can restore. Green means inside the margin; red means expect failures.

4

Export at the size you will use

PNG at 320 to 3,000 px, or an SVG that stays correct at any of those. Each export size reports its printed module edge at 300 dpi so you can see whether it is scannable before it goes to print.

5

Or build a label sheet

Paste or upload a list and the batch panel renders up to 200 codes onto A4 label sheets with captions, plus a manifest CSV tying each label to its row.

6

Test the printed proof

Scan the physical result on one iPhone and one Android at the distance people will actually stand. That is the only check that counts.

How this tool draws a logo onto the code

Two calls, one canvas. The payload side of things — Wi-Fi strings, vCard lines, escaping — is documented with copy-paste code on the QR code generator; this page owns what happens between the symbol and the printed page.

Browser example with qrcode + canvas

import QRCode from "qrcode";

async function renderQrWithLogo(canvas, payload, logoImage, { level = "H", margin = 4, logoPercent = 22 }) {
  await QRCode.toCanvas(canvas, payload, { width: canvas.width, margin, errorCorrectionLevel: level });

  const ctx = canvas.getContext("2d");
  const symbolModules = QRCode.create(payload, { errorCorrectionLevel: level }).modules.size;
  const imageModules = symbolModules + margin * 2;
  const scale = canvas.width / imageModules;

  // A percentage of the symbol edge, not of the canvas: the quiet zone must not
  // change how big the mark looks.
  const side = (logoPercent / 100) * symbolModules * scale;
  const x = (canvas.width - side) / 2;

  ctx.fillStyle = "#ffffff";                       // guard plate
  ctx.fillRect(x - 8, x - 8, side + 16, side + 16);
  ctx.drawImage(logoImage, x, x, side, side);
}

The overlay maths this tool uses

// Percentages are taken of the SYMBOL edge, and the placement is in
// module units — so the same numbers position correctly at 320 px and 3,000 px.
const symbolModules = 25;              // v3: 21 data + border + format rows
const imageModules = symbolModules + margin * 2;
const logoSide = (logoPercent / 100) * symbolModules;
const centre = imageModules / 2;

ctx.drawImage(logo, centre - logoSide / 2, centre - logoSide / 2, logoSide, logoSide);

// Coverage is an area, which is why a 25% logo is not "a quarter of the code":
const coveredArea = ((logoSide + plate * 2) / symbolModules) ** 2; // 25% -> ~8%
const budget = { L: 0.07, M: 0.15, Q: 0.25, H: 0.3 }[errorCorrectionLevel];
const verdict = coveredArea / budget;   // <0.5 safe · <0.9 tight · else risky

Example use case

A common workflow is encoding a short event URL, placing a centred brand mark over the code, then scanning the final export on both iPhone and Android before it goes to print or into a slide deck.

Scan reliability tips

If the code becomes hard to scan, shorten the payload first, keep the logo between 18% and 25% of the symbol width, and leave the white plate on so dark modules do not bleed into the artwork.

Need Wi-Fi, vCard or a CSV of codes?

The plain generator page documents every payload format, the escaping rules that decide whether a phone accepts them, and the copy-paste code for each one.

Open the QR Code Generator

Want the deeper tutorial?

The companion article covers logo safe zones, React integration, browser-specific gotchas, and what to check before a print run.

Read the with-logo tutorial

Frequently asked questions

Can I add a logo to a QR code without a server upload?

Yes. This tool keeps the text, QR rendering, and logo composition in the browser so the uploaded image does not need to leave the device. The logo is read into a data URL and embedded in the SVG you download, so the file stays usable on its own.

What error correction level should I use for a logo overlay?

Level H, which restores roughly 30% of the codewords, is the safest default for a branded code. Levels Q and M work with a small logo, and level L leaves almost nothing to spare — the coverage meter on this page tells you which side of that line you are on before you print.

How large should the logo be in the middle of a QR code?

Start between 18% and 25% of the symbol width. That is 3% to 6% of its area, which sits comfortably inside what level H can rebuild. Above about 30% of the width you are spending most of the recovery budget, and a scratched or partly painted code starts failing.

Should I download PNG or SVG for printing?

SVG for anything printed, PNG for anything that has to be an image file. The SVG is vector, so the same file is correct on a 25 mm sticker and a poster, and the logo rides inside it as an embedded image rather than a separate asset. A 3,000 px PNG is also fine at 300 dpi, which is 254 mm across.

Can I generate many QR codes at once?

Yes — paste a column or drop a CSV in the batch panel and it renders up to 200 labels onto A4 sheets, with the caption from another row printed under each code and a manifest CSV that records which row produced which payload. Rendering is capped at 200 per pass so a phone tab stays responsive; run the rest as a second batch.

Should I use a static or dynamic QR code for branded campaigns?

Use a static QR code when the destination will not change. Choose a dynamic QR service only when you need to re-target the link later or count scans — and understand that you are then trusting someone else's redirect to keep working for as long as your printed codes are on the wall.

What improves scan reliability when a QR code includes a logo?

Keep the payload short, leave the white plate behind the logo enabled, keep contrast above 4.5:1, and test the printed proof on one iPhone and one Android before the run. Those four do more for reliability than making the image bigger.