gozxing
gozxing copied to clipboard
FormatException: FormatException: we didn't find a close enough match 0x2fe8e
I get an error using gozxing to decode the QR code:
FormatException: FormatException: we didn't find a close enough match 0x2fe8e
I chose other QR code decoding libraries as a comparison, and only gozxing fails to decode, and I'm not sure if it's caused by a problem with my code.
Test image:
Here's my code:
package main
import (
"bytes"
"fmt"
"image"
"io/ioutil"
"log"
"os"
"github.com/clsung/grcode"
"github.com/liyue201/goqr"
"github.com/makiuchi-d/gozxing"
"github.com/makiuchi-d/gozxing/qrcode"
ttqrcode "github.com/tuotoo/qrcode"
)
func goQR(filename string) {
imgdata, err := ioutil.ReadFile(filename)
if err != nil {
fmt.Printf("%v\n", err)
return
}
img, _, err := image.Decode(bytes.NewReader(imgdata))
if err != nil {
fmt.Printf("image.Decode error: %v\n", err)
return
}
qrCodes, err := goqr.Recognize(img)
if err != nil {
fmt.Printf("Recognize failed: %v\n", err)
return
}
for _, qrCode := range qrCodes {
fmt.Printf("[goqr] text: %s\n", qrCode.Payload)
}
}
func ttQR(filename string) {
fi, err := os.Open(filename)
if err != nil {
fmt.Println(err.Error())
return
}
defer fi.Close()
qrmatrix, err := ttqrcode.Decode(fi)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Printf("[tuotoo/qrcode] text: %s\n", qrmatrix.Content)
}
func gozxingQR(filename string) {
// open and decode image file
fileQR, _ := os.Open(filename)
imgQR, _, _ := image.Decode(fileQR)
// prepare BinaryBitmap
bmp, _ := gozxing.NewBinaryBitmapFromImage(imgQR)
// decode image
qrReader := qrcode.NewQRCodeReader()
result, err := qrReader.Decode(bmp, nil)
if err != nil {
fmt.Printf("Decode failed: %v\n", err)
return
}
fmt.Printf("[gozxing/qrcode] text: %s\n", result.GetText())
}
func zbarQR(filename string) {
results, err := grcode.GetDataFromFile(filename)
if err != nil {
log.Fatal(err)
}
if len(results) == 0 {
log.Printf("No qrcode detected from file: %s", filename)
}
for _, result := range results {
fmt.Printf("[zbarQR] text: %s\n", result)
}
}
func main() {
goQR("e.png")
ttQR("e.png")
gozxingQR("e.png")
zbarQR("e.png")
}
Result:
[goqr] text: 0028834a8e92f40112e7b92a39452c245de5d7f1f508507583c485c0c3480957e3a2ef0db73d37aaf40386b6fb7b74972eb20934d940fb42a8180c923a088396ed071b517ecd8c7fd953fb9899f64678f3b8efbff6bdb0106434bed23f822262488c9c4339b2d9f798790ce63366ee30ee8fed8fc1465bc057bfb2d024c84806b71ade626a7fb4fce3d7cce8d733a28f98213b2d03f7eda38b176e6b305cf1fe8461215d0e78f75856ade9376d469f9a41798761b73ccd82e523250221dc133414eff79e249cd164ac7cb875e997637ffee4f4acfd15e94df8cdf86fafdf5f920d2560ea18a0561ba20f04d1bd8b5df668df1cfb7b6636e7671877fd66c364e1041c
[tuotoo/qrcode] text: 0028834a8e92f40112e7b92a39452c245de5d7f1f508507583c485c0c3480957e3a2ef0db73d37aaf40386b6fb7b74972eb20934d940fb42a8180c923a088396ed071b517ecd8c7fd953fb9899f64678f3b8efbff6bdb0106434bed23f822262488c9c4339b2d9f798790ce63366ee30ee8fed8fc1465bc057bfb2d024c84806b71ade626a7fb4fce3d7cce8d733a28f98213b2d03f7eda38b176e6b305cf1fe8461215d0e78f75856ade9376d469f9a41798761b73ccd82e523250221dc133414eff79e249cd164ac7cb875e997637ffee4f4acfd15e94df8cdf86fafdf5f920d2560ea18a0561ba20f04d1bd8b5df668df1cfb7b6636e7671877fd66c364e1041c
Decode failed: FormatException: FormatException: we didn't find a close enough match 0x2fe8e
[zbarQR] text: 0028834a8e92f40112e7b92a39452c245de5d7f1f508507583c485c0c3480957e3a2ef0db73d37aaf40386b6fb7b74972eb20934d940fb42a8180c923a088396ed071b517ecd8c7fd953fb9899f64678f3b8efbff6bdb0106434bed23f822262488c9c4339b2d9f798790ce63366ee30ee8fed8fc1465bc057bfb2d024c84806b71ade626a7fb4fce3d7cce8d733a28f98213b2d03f7eda38b176e6b305cf1fe8461215d0e78f75856ade9376d469f9a41798761b73ccd82e523250221dc133414eff79e249cd164ac7cb875e997637ffee4f4acfd15e94df8cdf86fafdf5f920d2560ea18a0561ba20f04d1bd8b5df668df1cfb7b6636e7671877fd66c364e1041c
Try NewQRCodeMultiReader()
in github.com/makiuchi-d/gozxing/multi/qrcode
.
It has different detection algorithm.
func gozxingQR(filename string) {
// open and decode image file
fileQR, _ := os.Open(filename)
imgQR, _, _ := image.Decode(fileQR)
// prepare BinaryBitmap
bmp, _ := gozxing.NewBinaryBitmapFromImage(imgQR)
// decode image
qrReader := qrcode.NewQRCodeMultiReader()
result, err := qrReader.DecodeMultiple(bmp, nil)
if err != nil {
fmt.Printf("Decode failed: %v\n", err)
return
}
fmt.Printf("[gozxing/multi/qrcode] text: %s\n", result[0].GetText())
}
Thanks for your reply, it works fine using the code you provided. Was the reason it didn't work before because there were other pixels interfering with the QR code?