Can You Put a Photo in a vCard QR Code?

The vCard format has a field for it, so technically yes. We measured what it costs, and the answer is that the code stops being printable long before the photo is worth looking at.

By QRotto · Published · 7 min read

The vCard specification has a PHOTO field. You can put an image straight into a contact card, encoded as text, and a QR code can carry it. People ask for this constantly, usually for a business card or a conference badge, and most answers online are either "yes you can" or "no you cannot", with nothing behind either.

So we measured it.

The short version: a 32 pixel thumbnail, smaller than an emoji, takes a vCard code from 45 by 45 modules to 125 by 125. That needs about 53 mm of printed width, which is wider than a business card is tall. A photo at any sensible size does not fit in a QR code at all.

The short answer

Three QR codes for the same contact card. Without a photo it is 45 by 45 modules and needs 21 mm printed. With a 32 pixel thumbnail it is 125 by 125 and needs 53 mm. With a 96 pixel thumbnail it is 149 by 149 and needs 63 mm. All three decoded from a clean image.
Same contact details in all three. The only difference is the photo, and it is the difference between a code that fits on a card and one that does not fit on anything you would carry.

What a photo costs, measured

The vCard containsCharsGridMin printed widthDecoded
Name, phone, email, company12145 x 4521 mmYes
+ a 32 px thumbnail1,077125 x 12553 mmYes
+ a 48 px thumbnail1,165129 x 12955 mmYes
+ a 64 px thumbnail1,301137 x 13758 mmYes
+ a 96 px thumbnail1,641149 x 14963 mmYes
+ a 150 px photo2,589Does not fit in a QR code at all

Every one of those that fits does decode, on a clean digital image at full resolution. That is worth saying plainly, because the failure here is not "the code is broken". The code is perfectly valid. The problem is entirely about what happens when you print it.

A printed QR module needs roughly 0.4 mm before ink spread and camera focus start working against it, and every code needs a four module quiet zone on each side. So a 125 by 125 grid needs (125 + 8) x 0.4, which is 53 mm. A business card is 55 mm tall. You would be printing a code that fills the entire card, for a thumbnail nobody can see.

Put that next to the alternative. The same contact details with no photo fit in 21 mm, and a link to a contact page fits in under 15 mm. We worked through those numbers in our business card guide. A photo costs you more printed area than everything else on the card combined.

The hard ceiling nobody mentions

The 150 pixel row is not a judgement call. It is a hard limit of the format.

QR codes stop at version 40, which is a 177 by 177 grid, and that is the largest QR code that exists. Its capacity depends on the error correction level:

Error correctionMaximum bytes at version 40
L, lowest2,953
M, the common default2,331
Q1,663
H, highest1,273

Our 150 pixel photo produced a 2,589 character vCard. At level M that is past the ceiling, and the encoder refuses: there is no version 41 to grow into. You would have to drop to level L, giving up almost all error correction, to fit it into a 177 by 177 code needing about 74 mm of print.

At level H, the level you would want for anything carrying a logo or destined for wear, the whole budget is 1,273 bytes. That is smaller than our 48 pixel thumbnail. A photo and error correction are close to mutually exclusive.

Why a photo is so expensive

Two multiplications stack up, and that is what surprises people.

First, an image has to be turned into text to live inside a vCard, using base64. That encoding is about a third larger than the raw file. A 750 byte JPEG becomes roughly 1,000 characters.

Second, a QR code grows in fixed version steps, and each step adds four modules to every side. Going from 121 characters to 1,077 is not a small nudge along a curve, it is roughly twenty version steps, and the printed area grows with the square.

So a thumbnail that is 1 KB as a file, which sounds like nothing, is eight times the entire rest of the contact card once encoded, and the code that carries it has almost eight times the area.

What to do instead

Everyone asking this wants the same outcome: the person who scans your card ends up with your face next to your name in their phone. There are two honest ways to get that, and neither involves putting the image in the code.

  1. Point the code at a contact page you control. The page can show the photo at any size and offer a downloadable contact file that includes it. The code itself stays at the 2 cm (0.8 in) minimum because it only carries a short URL. This is the approach we would use for anything printed.
  2. Use a plain vCard code and let their phone find the photo. Save a contact with an email address and most phones will pull a profile picture from the linked account or from the person's own address book sync. You get the photo without paying for it in millimetres.

There is a third option people try that we would avoid: putting your photo next to the code on the card, and a plain vCard inside it. That is fine, and it is what most well designed cards already do. It just is not the same thing as a photo in the code, and it works precisely because the photo is not in the code.

Our vCard generator deliberately does not offer a photo field, for the reasons above. If you want to test any code you have made, including one from another tool with a photo in it, our stress test will show you how much blur and how small a print it survives.

How to make a vCard QR code with a photo

Our vCard QR code generator deliberately has no photo field, for the size reasons below. You can still build a code with a photo, because a vCard code is just text, and our text QR code generator encodes exactly what you paste. We tested that on the live page with a multi-line vCard containing a photo line, and the code read back identical to what we pasted.

Step 1: Choose how the photo is attached

This is the decision that sets the size. The measurements above show what each route costs.

Step 2: Write the contact text

For the link route, a complete card looks like this:

BEGIN:VCARD
VERSION:3.0
FN:Sarah Mitchell
N:Mitchell;Sarah;;;
ORG:Northgate Design
TEL;TYPE=CELL:+14155550142
EMAIL:sarah@northgate.design
PHOTO;VALUE=uri:https://northgate.design/sarah.jpg
END:VCARD

The PHOTO;VALUE=uri: line followed by the picture's address is the part that adds the photo. The format allows it. Whether a particular phone then goes and downloads that picture when it saves the contact is something we have not tested, so check on the devices that matter to you.

Step 3: Generate the code

Paste the finished text into the text generator and download the code. Use PNG for screens and SVG if anything is going to a printer.

Step 4: Scan it back and test on a phone

Read the code with a plain QR scanner first and check the text for typos. Then scan it with a phone, save the contact, and open the saved entry to see whether the name, number and photo all landed. Do this before anything is printed.

Three QR codes for the same contact drawn at the same module size. With no photo it is 53 by 53 modules and needs 24.4 mm. With a link to a photo it is 57 by 57 modules and needs 26.0 mm. With a 32 pixel thumbnail embedded it is 137 by 137 modules, much larger, and needs 58.0 mm.
The same contact three ways, drawn at the same module size. The photo link adds a little. The embedded thumbnail dwarfs everything else. This used a different contact from the test above, so the embedded size here is 58 mm rather than 53 mm.

How we tested this

Two honest limits. The 0.4 mm floor is a common working figure for laser printing rather than something we measured on a press. And our test images are synthetic gradients rather than real portraits, so a real face may compress slightly better or worse, which moves the character counts by a little and the conclusion by nothing.

The summary

You can put a photo in a vCard QR code. The specification allows it, the encoder will do it, and the result decodes. It is still the wrong thing to do, because the code you get needs more printed space than the card it was meant to go on.

A 32 pixel thumbnail costs you 32 mm of extra printed width. Point the code at a page with the photo on it instead, and keep the code near the 2 cm (0.8 in) minimum.

If you want the contact card itself, our vCard QR code generator builds one from the fields that are worth carrying, and our business card guide has the millimetre by millimetre breakdown of what each field costs.

Frequently asked questions

Can a vCard QR code hold a photo?

A very small thumbnail can be embedded, but it makes the code several times larger. In our test a 32 pixel thumbnail took the code from 24.4 mm to 58.0 mm. A photo of ordinary size does not fit in a QR code at all.

Will the photo show up when someone saves my contact?

That depends on the phone and on how the photo was attached. We did not test this across devices, so we cannot promise it. Scan your own finished code on the phones that matter to you and open the saved contact.

What is the easiest way to get my photo in front of people?

Print it beside the code on the card, or link to a contact page that shows it. Both give people your face without asking the code to carry it.

Can I put a picture in the middle of the QR code instead?

That is a logo, not contact data. It covers some of the code's modules and uses up error correction, so it needs a higher level and a check that the code still reads. Our custom QR code generator decodes the styled code after each change and tells you whether it still scans.

What format does a vCard QR code use?

It uses the vCard text format, the same one a phone exports when you share a contact. The text starts with BEGIN:VCARD and VERSION:3.0, then one line per field, such as FN for the display name, N for the name in parts, ORG, TEL, EMAIL and URL, and it ends with END:VCARD. Version 3.0 is the safer default for compatibility, and it is what our vCard generator writes. A PHOTO line can be added in the same format, as shown in step 2 above.

Does a vCard QR code expire?

A static one does not. It is a printed pattern holding the contact text, with nothing behind it that can lapse.

Can I change the details after printing?

No. A static code cannot be edited. If your details may change, link to a page you control and update the page instead.

Is it free to make a vCard QR code?

Yes. Our vCard generator and text generator are free, need no signup, and build the code in your browser, so nothing you type is uploaded.

QRotto

QRotto builds free browser based QR code generators and writes the guides that go with them. Every generator is verified by decoding the codes it produces and confirming the output matches the input exactly. See our editorial standards.