QR Code(Quick Response Code) Implement by Go
The QRCode Generator, Micro QRCode Generator, QRCode Decoder, Micro QRCode Decoder application.
According to ISO/IEC 18004-2015 Standard
Installation
go get -u github.com/KangSpace/gqrcode
Dependencies Package:
- imaging
go get -u github.com/disintegration/imaging
- image
mkdir $GOPATH/golang.org/x/
cd $GOPATH/golang.org/x/
git clone https://github.com/golang/image.git
- text
cd $GOPATH/golang.org/x/
git clone https://github.com/golang/text.git
Usage
QR Code
QRCode supports 4 character modes, and 40 versions with 4 Error correction levels.
Micro QRCode supports 4 character modes, and 4 versions with 4 Error correction levels.
4 Modes:
-
numeric
characters(10): 0 - 9
maximum characters in Version 40-L: 7089 characters.
-
alphanumeric
characters(45): 0 - 9, A - Z, SP, $, %, *, +, -, ., /, :
maximum characters in Version 40-L: 4296 characters.
Alphanumeric mode is not available in Version M1 Micro QR Code Symbol
-
byte
8-bit characters.
maximum characters in Version 40-L: 2953 characters.
Byte mode is not available in Version M1 or M2 Micro QR Code Symbol.
-
kanji
Kanji characters in accordance with the Shift JIS system based on JIS X 0209.
Only use for double-byte characters, Range are: \x8140-\x9FFC and \xE040-\xEBBF.
maximum characters in Version 40-L: 2953 characters.
Kanji mode is not available in Version M1 Or M2 Micro QR Code Symbol.
4 Error correction level:
Four levels of Reed-Solomon error correction(referred to as L, M, Q and H in increasing order of capacity) allowing recover of:
- L 7%
- M 15%
- Q 25%
- H 30%
Micro QR Code is not support H level.
Create QR Code
// create a numeric qrcode
data := "0123456"
qrcode, err := NewQRCode(data)
outFileName := "/opt/temp/numeric.png"
if err == nil{
// set color for qrcode
// out := output.NewOutput(&output.BaseOutput{Type: output.PNG, Size: 400, CodeColor: output.ColorfulCodeColor})
out := output.NewPNGOutput0()
qrcode.Encode(out,outFileName)
}
// create a numeric micro qrcode
micQrcode, err := NewMicroQRCode(data)
outFileName2 := "/opt/temp/numeric_micro.png"
if err == nil{
out2 := output.NewPNGOutput0()
micQrcode.Encode(out2,outFileName2)
}
-
NewQRCode(content string) (*mode.QRCodeStruct,error)
Create a new QRCode(Model2) by input data.
There will be auto-detected the Version, Error Correction Level, and without Quiet Zone.
e.g.:

-
NewQRCodeAutoQuiet(content string) (*mode.QRCodeStruct,error)
Create a new QRCode(Model2) by input data with auto-size Quiet Zone, default is 4x modules per side.
e.g.:

QRCode with color:

-
NewMicroQRCode(content string) (*mode.QRCodeStruct,error)
Create a new Micro QRCode by input data.
e.g.:

-
NewMicroQRCodeAutoQuiet(content string) (*mode.QRCodeStruct,error)
Create a new Micro QRCode by input data with auto-size Quiet Zone, default is 2x modules per side.
e.g.:

-
NewQRCode0(content string,format cons.Format,ec *mode.ErrorCorrection,m mode.Mode,quietZone *model.QuietZone) (qr *mode.QRCodeStruct,err error)
Create a new QRCode by input data with full parameters.
Params:
| Parameter |
Type |
Values |
Comments |
| content |
string |
numeric,alphanumeric,and other strings |
- |
| format |
cons.Format |
cons.QRCODE,cons.QrcodeModel2,cons.MicroQrcode |
cons.QRCODE same with cons.QrcodeModel2 |
| ec |
*mode.ErrorCorrection |
NewErrorCorrection(level) |
level in (cons.L,cons.M,cons.Q,cons.H) |
| m |
mode.Mode |
NewNumericMode(),NewAlphanumericMode(),NewKanjiModeMode(), NewByteModeMode() |
- |
| quietZone |
*model.QuietZone |
model.AutoQuietZone,model.NoneQuietZone,NewQuietZone(size int) |
- |
Encode QR Code
out := output.NewPNGOutput0()
qrcode.Encode(out,outFileName)
Encode Params:
| Parameter |
Type |
Values |
Comments |
| out |
output.Output |
NewPNGOutput(size int), NewPNGOutput0(), NewJPGOutput(size int), NewJPGOutput0(), NewGIFOutput(size int), NewGIFOutput0() |
Newxxx0() output with auto-size for image. |
| fileName |
string |
output file path |
- |
Output QRCode
output.ImageOutput implements output.Output interface to output PNG,JPG,GIF image.
out := output.NewPNGOutput(100)
out = output.NewPNGOutput0()
logoImageFilePath := "logo.png"
// add logo image into QRCode
out.AddOption(output.LogoOption(logoImageFilePath))
Output Params:
| Parameter |
Type |
Values |
Comments |
| size |
int |
the image size for output |
- |
Test QR Code
All QRCode test in qrcode_test.go and micro_qrcode_test.go files.
TODO list
| Type |
Item |
Done Time |
| QRCode Model2 |
Numeric Mode and test |
2021-05-30 22:47:57 |
| Alphanumeric Mode |
2021-05-31 |
| Byte Mode |
2021-05-31 |
| Kanji Mode |
2021-06-01 |
| ECI Mode |
NOT-IMPLEMENT |
| FNC1 Mode |
NOT-IMPLEMENT |
| Mixed Mode |
NOT-IMPLEMENT |
| Structured Append Mode |
NOT-IMPLEMENT |
| QRCode Model1 |
- |
NOT-SUPPORT |
| Micro QRCode |
Micro QRCode |
2021-06-07 |
Personalized QRCode
(add logo image at center of QRCode)
|
- |
2021-06-02 |
|
Output
|
Image File (With Color) |
2021-05-30 (2022-09-17) |
| Base64 String |
2021-06-01 |
| SVG |
- |
|
Decoder
|
QRCode |
- |
| Micro QRCode |
- |
附录:
- Best size of QR code of each version. (1 point by 4 pixels!)
| Version |
None QuietZone |
1xQuietZone |
2xQuietZone |
4xQuietZone |
maxCharacterLen(AlphaNumeric,L) |
| 1 |
84 |
92 |
100 |
116 |
25 |
| 2 |
100 |
108 |
116 |
132 |
47 |
| 3 |
116 |
124 |
132 |
148 |
77 |
| 4 |
132 |
140 |
148 |
164 |
114 |
| 5 |
148 |
156 |
164 |
180 |
154 |
| 6 |
164 |
172 |
180 |
196 |
195 |
| 7 |
180 |
188 |
196 |
212 |
224 |
| 8 |
196 |
204 |
212 |
228 |
279 |
| 9 |
212 |
220 |
228 |
244 |
335 |
| 10 |
228 |
236 |
244 |
260 |
395 |
| 11 |
244 |
252 |
260 |
276 |
468 |
| 12 |
260 |
268 |
276 |
292 |
535 |
| 13 |
276 |
284 |
292 |
308 |
619 |
| 14 |
292 |
300 |
308 |
324 |
667 |
| 15 |
308 |
316 |
324 |
340 |
758 |
| 16 |
324 |
332 |
340 |
356 |
854 |
| 17 |
340 |
348 |
356 |
372 |
938 |
| 18 |
356 |
364 |
372 |
388 |
1046 |
| 19 |
372 |
380 |
388 |
404 |
1153 |
| 20 |
388 |
396 |
404 |
420 |
1249 |
| 21 |
404 |
412 |
420 |
436 |
1352 |
| 22 |
420 |
428 |
436 |
452 |
1460 |
| 23 |
436 |
444 |
452 |
468 |
1588 |
| 24 |
452 |
460 |
468 |
484 |
1704 |
| 25 |
468 |
476 |
484 |
500 |
1853 |
| 26 |
484 |
492 |
500 |
516 |
1990 |
| 27 |
500 |
508 |
516 |
532 |
2132 |
| 28 |
516 |
524 |
532 |
548 |
2223 |
| 29 |
532 |
540 |
548 |
564 |
2369 |
| 30 |
548 |
556 |
564 |
580 |
2520 |
| 31 |
564 |
572 |
580 |
596 |
2677 |
| 32 |
580 |
588 |
596 |
612 |
2840 |
| 33 |
596 |
604 |
612 |
628 |
3009 |
| 34 |
612 |
620 |
628 |
644 |
3183 |
| 35 |
628 |
636 |
644 |
660 |
3351 |
| 36 |
644 |
652 |
660 |
676 |
3537 |
| 37 |
660 |
668 |
676 |
692 |
3729 |
| 38 |
676 |
684 |
692 |
708 |
3927 |
| 39 |
692 |
700 |
708 |
724 |
4087 |
| 40 |
708 |
716 |
724 |
740 |
4296 |
| M1 |
44 |
52 |
60 |
76 |
5(Numeric) |
| M2 |
52 |
60 |
68 |
84 |
6 |
| M3 |
60 |
68 |
76 |
92 |
14 |
| M4 |
68 |
76 |
84 |
100 |
21 |