Skip to content

QR Code Generation

FxCanvas includes built-in QR code generation capabilities through the QRContext extension. This allows you to programmatically create QR codes that encode text data, with configurable error correction levels and modes.

INFO

QR Code is a registered trademark of DENSO WAVE INCORPORATED

Definitions

  • ECC (Error Correction Code): Redundancy level for data recovery (L=7%, M=15%, Q=25%, H=30%).
  • Module: Smallest square unit in a QR code (black/white square).

Basic QR Code Generation

javascript
import { CanvasEncoder, QRMode, QRCorrectionLevel } from 'fxcanvas';

const canvas = new CanvasEncoder(400, 200);

// Draw a QR code encoding "Hello World"
canvas.qr.drawQRCode(50, 50, 100, 'Hello World');

QR Code Parameters

Position and Size

javascript
// Draw QR code at (x, y) with specified size
canvas.qr.drawQRCode(x, y, size, text);

- `x`, `y`: Top-left position of the QR code
- `size`: Width and height of the QR code square
- `text`: The text data to encode

Note that while you can specify a desired QR size, the minimum QR size is determined by the space required for 4 pixels per module (2x2 block). FxCanvas automatically sets a lower bound based on the input length, ECC level, and encoding mode. The specified size can only upscale from this minimum.

To choose an appropriate size for your expected input range, consult the threshold tables below.

Encoding Modes

QR mode is automatically detected from the input text. Supported modes include Numeric, Alphanumeric, Byte, and Kanji.

javascript
// Numeric data (digits only, most efficient)
canvas.qr.drawQRCode(50, 50, 100, '1234567890');

// Alphanumeric data (digits, letters, some symbols)
canvas.qr.drawQRCode(50, 50, 100, 'HELLO123');

// Byte data (any 8-bit data, including Unicode)
canvas.qr.drawQRCode(50, 50, 100, 'Hello 世界');

// Kanji data (Japanese characters)
canvas.qr.drawQRCode(50, 50, 100, '日本語');

Error Correction Levels

Configure error correction for reliability:

javascript
import { QRCorrectionLevel } from 'fxcanvas';

// Low correction (7% of data can be restored)
canvas.qr.setErrorCorrectionLevel(QRCorrectionLevel.L);

// Medium correction (15% of data can be restored) - Default
canvas.qr.setErrorCorrectionLevel(QRCorrectionLevel.M);

// Quartile correction (25% of data can be restored)
canvas.qr.setErrorCorrectionLevel(QRCorrectionLevel.Q);

// High correction (30% of data can be restored)
canvas.qr.setErrorCorrectionLevel(QRCorrectionLevel.H);

canvas.qr.drawQRCode(50, 50, 100, 'Important Data');

Higher error correction levels create larger QR codes but can withstand more damage.

Advanced Usage

Multiple QR Codes

Draw multiple QR codes in a single composition:

javascript
// QR code for URL
canvas.qr.setErrorCorrectionLevel(QRCorrectionLevel.M);
canvas.qr.drawQRCode(50, 50, 80, 'https://example.com');

// QR code for contact info
canvas.qr.setErrorCorrectionLevel(QRCorrectionLevel.H);
canvas.qr.drawQRCode(200, 50, 80, 'BEGIN:VCARD\nFN:John Doe\nEND:VCARD');

// QR code for WiFi credentials
const wifiData = 'WIFI:S:MyNetwork;T:WPA;P:mypassword;;';
canvas.qr.setErrorCorrectionLevel(QRCorrectionLevel.Q);
canvas.qr.drawQRCode(50, 200, 80, wifiData);

Styled QR Codes

Combine QR codes with other drawing operations:

javascript
// Draw background
canvas.setFillStyle(new Color(255, 255, 255));
canvas.fillRect(40, 40, 120, 120);

// Draw QR code
canvas.qr.drawQRCode(50, 50, 100, 'Styled QR Code');

// Add border
canvas.setStrokeStyle(new Color(0, 0, 0));
canvas.setLineWidth(2);
canvas.strokeRect(40, 40, 120, 120);

// Add label
const font = new Font({ size: 12, faces: [fontFace] });
canvas.setFont(font);
canvas.setFillStyle(new Color(0, 0, 0));
canvas.setTextAlign(TextAlign.Center);
canvas.fillText('Scan me!', 100, 170);

QR codes can include custom text styling; see Fonts and Text.

Combine QR codes with background images; see Working with Images.

Transformed QR Codes

Apply transformations to QR codes:

javascript
canvas.save();
canvas.translate(150, 150);
canvas.rotate(Math.PI / 6); // 30-degree rotation
canvas.qr.drawQRCode(-50, -50, 100, 'Rotated QR');
canvas.restore();

QR Code Limitations

  • Maximum data capacity depends on mode and error correction level
  • Very large data may require high error correction or may not fit
  • QR codes work best with square dimensions
  • Complex transformations may affect scanability

Use Cases

QR codes are perfect for:

  • URLs and Links: Website addresses, app downloads
  • Contact Information: vCard data, business cards
  • WiFi Credentials: Network sharing
  • Text Messages: Short text content
  • Event Details: Calendar events, tickets
  • Product Information: Serial numbers, specifications

Threshold Tables

The following tables show the minimum square pixel dimensions required for different input lengths, ECC levels, and encoding modes at 4 pixels per module. These represent the automatic lower bounds that FxCanvas enforces.

Numeric Encoding Thresholds

ECC LevelInput Length RangeMin Size
Low0-4184
Low42-77100
Low78-127116
Low128-187132
Low188-255148
Low256-322164
Low323-370180
Low371-461196
Low462-552212
Low553-652228
Low653-772244
Low773-883260
Low884-1022276
Low1023-1101292
Low1102-1250308
Low1251-1408324
Low1409-1548340
Low1549-1725356
Low1726-1903372
Low1904-2061388
Low2062-2232404
Low2233-2409420
Low2410-2620436
Low2621-2812452
Low2813-3057468
Low3058-3283484
Low3284-3517500
Low3518-3669516
Low3670-3909532
Low3910-4158548
Low4159-4417564
Low4418-4686580
Low4687-4965596
Low4966-5253612
Low5254-5529628
Low5530-5836644
Low5837-6153660
Low6154-6479676
Low6480-6743692
Low6744-7089708
Medium0-3484
Medium35-63100
Medium64-101116
Medium102-149132
Medium150-202148
Medium203-255164
Medium256-293180
Medium294-365196
Medium366-432212
Medium433-513228
Medium514-604244
Medium605-691260
Medium692-796276
Medium797-871292
Medium872-991308
Medium992-1082324
Medium1083-1212340
Medium1213-1346356
Medium1347-1500372
Medium1501-1600388
Medium1601-1708404
Medium1709-1872420
Medium1873-2059436
Medium2060-2188452
Medium2189-2395468
Medium2396-2544484
Medium2545-2701500
Medium2702-2857516
Medium2858-3035532
Medium3036-3289548
Medium3290-3486564
Medium3487-3693580
Medium3694-3909596
Medium3910-4134612
Medium4135-4343628
Medium4344-4588644
Medium4589-4775660
Medium4776-5039676
Medium5040-5313692
Medium5314-5596708
Quartile0-2784
Quartile28-48100
Quartile49-77116
Quartile78-111132
Quartile112-144148
Quartile145-178164
Quartile179-207180
Quartile208-259196
Quartile260-312212
Quartile313-364228
Quartile365-427244
Quartile428-489260
Quartile490-580276
Quartile581-621292
Quartile622-703308
Quartile704-775324
Quartile776-876340
Quartile877-948356
Quartile949-1063372
Quartile1064-1159388
Quartile1160-1224404
Quartile1225-1358420
Quartile1359-1468436
Quartile1469-1588452
Quartile1589-1718468
Quartile1719-1804484
Quartile1805-1933500
Quartile1934-2085516
Quartile2086-2181532
Quartile2182-2358548
Quartile2359-2473564
Quartile2474-2670580
Quartile2671-2805596
Quartile2806-2949612
Quartile2950-3081628
Quartile3082-3244644
Quartile3245-3417660
Quartile3418-3599676
Quartile3600-3791692
Quartile3792-3993708
High0-1784
High18-34100
High35-58116
High59-82132
High83-106148
High107-139164
High140-154180
High155-202196
High203-235212
High236-288228
High289-331244
High332-374260
High375-427276
High428-468292
High469-530308
High531-602324
High603-674340
High675-746356
High747-813372
High814-919388
High920-969404
High970-1056420
High1057-1108436
High1109-1228452
High1229-1286468
High1287-1425484
High1426-1501500
High1502-1581516
High1582-1677532
High1678-1782548
High1783-1897564
High1898-2022580
High2023-2157596
High2158-2301612
High2302-2361628
High2362-2524644
High2525-2625660
High2626-2735676
High2736-2927692
High2928-3057708

Alphanumeric Encoding Thresholds

ECC LevelInput Length RangeMin Size
Low0-2584
Low26-47100
Low48-77116
Low78-114132
Low115-154148
Low155-195164
Low196-224180
Low225-279196
Low280-335212
Low336-395228
Low396-468244
Low469-535260
Low536-619276
Low620-667292
Low668-758308
Low759-854324
Low855-938340
Low939-1046356
Low1047-1153372
Low1154-1249388
Low1250-1352404
Low1353-1460420
Low1461-1588436
Low1589-1704452
Low1705-1853468
Low1854-1990484
Low1991-2132500
Low2133-2223516
Low2224-2369532
Low2370-2520548
Low2521-2677564
Low2678-2840580
Low2841-3009596
Low3010-3183612
Low3184-3351628
Low3352-3537644
Low3538-3729660
Low3730-3927676
Low3928-4087692
Low4088-4296708
Medium0-2084
Medium21-38100
Medium39-61116
Medium62-90132
Medium91-122148
Medium123-154164
Medium155-178180
Medium179-221196
Medium222-262212
Medium263-311228
Medium312-366244
Medium367-419260
Medium420-483276
Medium484-528292
Medium529-600308
Medium601-656324
Medium657-734340
Medium735-816356
Medium817-909372
Medium910-970388
Medium971-1035404
Medium1036-1134420
Medium1135-1248436
Medium1249-1326452
Medium1327-1451468
Medium1452-1542484
Medium1543-1637500
Medium1638-1732516
Medium1733-1839532
Medium1840-1994548
Medium1995-2113564
Medium2114-2238580
Medium2239-2369596
Medium2370-2506612
Medium2507-2632628
Medium2633-2780644
Medium2781-2894660
Medium2895-3054676
Medium3055-3220692
Medium3221-3391708
Quartile0-1684
Quartile17-29100
Quartile30-47116
Quartile48-67132
Quartile68-87148
Quartile88-108164
Quartile109-125180
Quartile126-157196
Quartile158-189212
Quartile190-221228
Quartile222-259244
Quartile260-296260
Quartile297-352276
Quartile353-376292
Quartile377-426308
Quartile427-470324
Quartile471-531340
Quartile532-574356
Quartile575-644372
Quartile645-702388
Quartile703-742404
Quartile743-823420
Quartile824-890436
Quartile891-963452
Quartile964-1041468
Quartile1042-1094484
Quartile1095-1172500
Quartile1173-1263516
Quartile1264-1322532
Quartile1323-1429548
Quartile1430-1499564
Quartile1500-1618580
Quartile1619-1700596
Quartile1701-1787612
Quartile1788-1867628
Quartile1868-1966644
Quartile1967-2071660
Quartile2072-2181676
Quartile2182-2298692
Quartile2299-2420708
High0-1084
High11-20100
High21-35116
High36-50132
High51-64148
High65-84164
High85-93180
High94-122196
High123-143212
High144-174228
High175-200244
High201-227260
High228-259276
High260-283292
High284-321308
High322-365324
High366-408340
High409-452356
High453-493372
High494-557388
High558-587404
High588-640420
High641-672436
High673-744452
High745-779468
High780-864484
High865-910500
High911-958516
High959-1016532
High1017-1080548
High1081-1150564
High1151-1226580
High1227-1307596
High1308-1394612
High1395-1431628
High1432-1530644
High1531-1591660
High1592-1658676
High1659-1774692
High1775-1852708

Byte Encoding Thresholds

ECC LevelInput Length RangeMin Size
Low0-1784
Low18-32100
Low33-53116
Low54-78132
Low79-106148
Low107-134164
Low135-154180
Low155-192196
Low193-230212
Low231-271228
Low272-321244
Low322-367260
Low368-425276
Low426-458292
Low459-520308
Low521-586324
Low587-644340
Low645-718356
Low719-792372
Low793-858388
Low859-929404
Low930-1003420
Low1004-1091436
Low1092-1171452
Low1172-1273468
Low1274-1367484
Low1368-1465500
Low1466-1528516
Low1529-1628532
Low1629-1732548
Low1733-1840564
Low1841-1952580
Low1953-2068596
Low2069-2188612
Low2189-2303628
Low2304-2431644
Low2432-2563660
Low2564-2699676
Low2700-2809692
Low2810-2953708
Medium0-1484
Medium15-26100
Medium27-42116
Medium43-62132
Medium63-84148
Medium85-106164
Medium107-122180
Medium123-152196
Medium153-180212
Medium181-213228
Medium214-251244
Medium252-287260
Medium288-331276
Medium332-362292
Medium363-412308
Medium413-450324
Medium451-504340
Medium505-560356
Medium561-624372
Medium625-666388
Medium667-711404
Medium712-779420
Medium780-857436
Medium858-911452
Medium912-997468
Medium998-1059484
Medium1060-1125500
Medium1126-1190516
Medium1191-1264532
Medium1265-1370548
Medium1371-1452564
Medium1453-1538580
Medium1539-1628596
Medium1629-1722612
Medium1723-1809628
Medium1810-1911644
Medium1912-1989660
Medium1990-2099676
Medium2100-2213692
Medium2214-2331708
Quartile0-1184
Quartile12-20100
Quartile21-32116
Quartile33-46132
Quartile47-60148
Quartile61-74164
Quartile75-86180
Quartile87-108196
Quartile109-130212
Quartile131-151228
Quartile152-177244
Quartile178-203260
Quartile204-241276
Quartile242-258292
Quartile259-292308
Quartile293-322324
Quartile323-364340
Quartile365-394356
Quartile395-442372
Quartile443-482388
Quartile483-509404
Quartile510-565420
Quartile566-611436
Quartile612-661452
Quartile662-715468
Quartile716-751484
Quartile752-805500
Quartile806-868516
Quartile869-908532
Quartile909-982548
Quartile983-1030564
Quartile1031-1112580
Quartile1113-1168596
Quartile1169-1228612
Quartile1229-1283628
Quartile1284-1351644
Quartile1352-1423660
Quartile1424-1499676
Quartile1500-1579692
Quartile1580-1663708
High0-784
High8-14100
High15-24116
High25-34132
High35-44148
High45-58164
High59-64180
High65-84196
High85-98212
High99-119228
High120-137244
High138-155260
High156-177276
High178-194292
High195-220308
High221-250324
High251-280340
High281-310356
High311-338372
High339-382388
High383-403404
High404-439420
High440-461436
High462-511452
High512-535468
High536-593484
High594-625500
High626-658516
High659-698532
High699-742548
High743-790564
High791-842580
High843-898596
High899-958612
High959-983628
High984-1051644
High1052-1093660
High1094-1139676
High1140-1219692
High1220-1273708

The QR extension makes it easy to add scannable QR codes to your FxCanvas-generated images.