From 11ded9c5abf8c5ce42e80d2743bfb109018565e5 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sat, 7 Nov 2020 13:11:34 +0100 Subject: [PATCH] switch to gozxing for visual similarity with SIX reference impl The SIX reference implementation in Java that can be found at https://www.paymentstandards.ch/dam/downloads/qrcodegenerator.java uses the zxing library to generate their QR codes. zxing is also available as a Go version, which we now use. This means the QR codes can be compared visually to the reference. --- go.mod | 3 +++ go.sum | 7 +++++++ qrcodegenerator.go | 20 ++++++++++++-------- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index a9018a5..2e1d763 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,9 @@ require ( github.com/ajstarks/svgo v0.0.0-20200320125537-f189e35d30ca github.com/boombuler/barcode v1.0.0 github.com/davecgh/go-spew v1.1.1 + github.com/makiuchi-d/gozxing v0.0.0-20200903113411-25f730ed83da github.com/mattn/go-isatty v0.0.12 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e + golang.org/x/text v0.3.4 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect ) diff --git a/go.sum b/go.sum index c07ed9d..3a9d933 100644 --- a/go.sum +++ b/go.sum @@ -6,9 +6,16 @@ github.com/boombuler/barcode v1.0.0 h1:s1TvRnXwL2xJRaccrdcBQMZxq6X7DvsMogtmJeHDd github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/makiuchi-d/gozxing v0.0.0-20200903113411-25f730ed83da h1:OgNu1PPD9EvZckyKDAc8DA4KymNXuc6vaCLsdOGyjOE= +github.com/makiuchi-d/gozxing v0.0.0-20200903113411-25f730ed83da/go.mod h1:WoI7z45M7ZNA5BJxiJHaB+x7+k8S/3phW5Y13IR4yWY= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/qrcodegenerator.go b/qrcodegenerator.go index 936b186..d45fd3a 100644 --- a/qrcodegenerator.go +++ b/qrcodegenerator.go @@ -19,8 +19,10 @@ import ( "image" "image/draw" - "github.com/boombuler/barcode" - "github.com/boombuler/barcode/qr" + "github.com/makiuchi-d/gozxing" + "github.com/makiuchi-d/gozxing/common" + "github.com/makiuchi-d/gozxing/qrcode" + "github.com/makiuchi-d/gozxing/qrcode/decoder" ) // This is a port of the Java 1.7 reference example from paymentstandards.ch: @@ -52,15 +54,17 @@ func generateSwissQrCode(payload string) (image.Image, error) { } func generateQrCodeImage(payload string) (image.Image, error) { - code, err := qr.Encode(payload, qr.M, qr.Unicode) + + w := qrcode.NewQRCodeWriter() + hints := map[gozxing.EncodeHintType]interface{}{ + gozxing.EncodeHintType_ERROR_CORRECTION: decoder.ErrorCorrectionLevel_M, + gozxing.EncodeHintType_CHARACTER_SET: common.CharacterSetECI_UTF8, + } + matrix, err := w.Encode(payload, gozxing.BarcodeFormat_QR_CODE, qrCodeEdgeSidePx, qrCodeEdgeSidePx, hints) if err != nil { return nil, err } - qrcode, err := barcode.Scale(code, qrCodeEdgeSidePx, qrCodeEdgeSidePx) - if err != nil { - return nil, err - } - return qrcode, nil + return matrix, nil } func overlayWithSwissCross(qrCodeImage image.Image) (image.Image, error) {