- Notifications
You must be signed in to change notification settings - Fork6
A portable QR and Barcode generation / manipulation library written in C.
License
NotificationsYou must be signed in to change notification settings
kikuchan/libqrean
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
A portable QR and Barcode generation / manipulation library written inC.
Wasm (thanks @taisukef)
% qrean -t rmqr Hello█████████████████████████████████ ▄▄▄▄▄ █ ▀ █ █ █▄█ █▄█▄█▄▄ ████ █ █ ██▄ ▄█▀▄▄ ▄▄ ▀█ ▄████ █▄▄▄█ ██▀▀▀▄█▄▄█▀█▄ █▀▀▄████▄▄▄▄▄▄▄█▄██ ▄ ▀▄█▀▀█▀▄ ▄▄▄ ████ ▄▀▀ ▀▄ ▄█▄███▀▀▄▄▀▄▀▄ █▄█ ████▄▄▄█▄█▄█▄█▄█▄█▄█▄█▄█▄█▄▄▄▄▄██▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀% qrean -t mQR Hello > mqr.png # CAVEAT: Outputs PNG stream for not a tty% qrean -o qr.png Hello # You can also specify output filename% qrean -hUsage: qrean [OPTION]... [STRING]Generate QR/Barcode image General options: -h Display this help -o FILENAME Image save as FILENAME -i FILENAME Data read from FILENAME -f FORMAT Output format, one of the following: TXT (default for tty) PNG (default for non tty) PPM -t CODE Output CODE, one of the following: QR, mQR, rMQR, tQR EAN13, EAN8, UPCA CODE39, CODE93 ITF, NW7 -p PADDING Comma-separated PADDING for the code QR family specific options: -v VERSION Use VERSION, one of the following: 1 ... 40 (for QR) M1 ... M4 (for mQR) R7x43 ... R17x139 (for rMQR) R{H}x{W} H: 7, 9, 11, 13, 15, 17 W: 43, 59, 77, 99, 139 tQR (for tQR) -m MASK Use MASK pattern, one of the following: 0 ... 7 (for QR) 0 ... 4 (for mQR) -l LEVEL Use ecc LEVEL, one of the following: L, M, Q, H (for QR) L, M, Q (for mQR) M, H (for rMQR)
% qrean-detect qr.png # The source file must be a PNG file so farHello%
qrean_tqrean=create_qrean(QREAN_CODE_TYPE_QR);qrean_write_string(&qrean,"Hello, world",QREAN_DATA_TYPE_AUTO);size_tlen=qrean_read_bitmap(&qrean,buffer,sizeof(buffer),8);fwrite(buffer,1,len,stdout);
qrean_write_pixel(&qrean,qrean.canvas.symbol_width-1,qrean.canvas.symbol_height-1,0);qrean_fix_errors(&qrean);qrean_read_string(&qrean,buffer,sizeof(buffer));printf("%s\n",buffer);
qrean_t*qrean=new_qrean(QREAN_CODE_TYPE_QR);qrean_set_qr_version(qrean,QR_VERSION_3);qrean_set_qr_errorlevel(qrean,QR_ERRORLEVEL_M);qrean_set_qr_maskpattern(qrean,QR_MASKPATTERN_7);qrean_write_qr_finder_pattern(qrean);qrean_write_qr_alignment_pattern(qrean);qrean_write_qr_timing_pattern(qrean);qrean_write_qr_format_info(qrean);qrean_write_qr_version_info(qrean);
Seeexamples/ directory for working examples.
import{Qrean}from'qrean';constqrean=newQrean();constimg=awaitqrean.encode('Hello, world');console.log(img);// {// width: 116,// height: 116,// data: Uint8ClampedArray(53824) [// :const{ detected}=awaitqrean.detect(img);console.log(detected[0].text);// Hello, world
It requires Wasm to run, but don't worry, most engines support it; Node, Deno, Bun and browsers.
- Windows
- Download fromRelease Page
- UNIX-like systems (Linux / macOS / *BSD)
- Just
make install
- Just
% npm install qrean
Take a look atsrc/ and include (or copy) them!
As you can see, you can take control.I love QR and Barcodes.
The core (encode/decode) doesn't rely onmalloc()
for portability. It uses a stack instead of a heap, but you can still usenew_qrean
for example if you prefer.
You can also configure a callback to draw a pixel directly on a screen for example.
type | encode | decode | detect |
---|---|---|---|
QR | ✓ | ✓ | ✓ |
mQR | ✓ | ✓ | ✓ |
rMQR | ✓ | ✓ | ✓ |
tQR | ✓ | ✓ | ✓ |
UPCA / EAN13 / EAN8 | ✓ | ✓ | ✓ |
CODE39 | ✓ | ✓ | ✓ |
CODE93 | ✓ | ✓ | ✓ |
NW7 | ✓ | ✓ | ✓ |
ITF | ✓ | ✓ | ✓ |