Dalam masyarakat moden, kod QR telah menjadi kaedah biasa penghantaran maklumat. Ia boleh menyampaikan maklumat dengan cepat dan memudahkan kehidupan orang ramai. Bagi pembangun, cara menjana dan mengimbas kod QR dengan mudah dan cepat adalah isu yang perlu dipertimbangkan. Dalam artikel ini, kami akan memperkenalkan cara menggunakan rangka kerja Gin untuk merealisasikan penjanaan dan fungsi pengimbasan kod QR.
Mula-mula, kita perlu memasang rangka kerja Gin dan perpustakaan berkaitan. Jalankan arahan berikut untuk melengkapkan pemasangan:
go get -u github.com/gin-gonic/gin go get -u github.com/skip2/go-qrcode go get -u github.com/fogleman/gg
Antaranya, gin ialah rangka kerja Gin, go-qrcode ialah perpustakaan untuk menjana kod QR, dan gg ialah perpustakaan untuk menjana gambar.
Seterusnya kita perlu menulis kod untuk menjana kod QR. Kita boleh mentakrifkan fungsi yang menghasilkan kod QR Kodnya adalah seperti berikut:
func generateQRCode(c *gin.Context) { // 获取传递的参数 content := c.Query("content") size := c.DefaultQuery("size", "256") // 生成二维码图片 qr, err := qrcode.New(content, qrcode.Medium) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{ "error": err.Error(), }) return } qr.DisableBorder = true img := qr.Image(int(size)) // 将图片存储为PNG格式 buffer := new(bytes.Buffer) err = png.Encode(buffer, img) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{ "error": err.Error(), }) return } // 将图片作为响应输出给客户端 c.Data(http.StatusOK, "image/png", buffer.Bytes()) }
Dalam kod di atas, kami membaca parameter content
yang diluluskan sebagai kandungan kod QR. kita juga boleh lulus size
Parameter untuk menetapkan saiz kod QR, nilai lalai ialah 256. Kami menggunakan fungsi go-qrcode
dalam pustaka qrcode.New
untuk menjana imej kod QR. Kami juga boleh mengalih keluar sempadan imej melalui atribut DisableBorder
. Akhir sekali, kami menggunakan fungsi gg
dalam pustaka png.Encode
untuk menyimpan imej dalam format PNG dan mengeluarkan imej sebagai respons kepada klien melalui kaedah c.Data
rangka kerja Gin.
Selepas menjana kod QR, kita perlu menulis kod untuk mengimbas kod QR. Kami boleh menambah laluan untuk mengimbas kod QR dalam laluan, kodnya adalah seperti berikut:
func scanQRCode(c *gin.Context) { // 读取上传的图片文件 file, err := c.FormFile("file") if err != nil { c.JSON(http.StatusInternalServerError, gin.H{ "error": err.Error(), }) return } // 打开上传的文件 f, err := file.Open() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{ "error": err.Error(), }) return } defer f.Close() // 读取文件内容并解码 img, err := png.Decode(f) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{ "error": err.Error(), }) return } content, err := qrcode.Decode(img) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{ "error": err.Error(), }) return } // 将解码后的内容作为响应输出给客户端 c.JSON(http.StatusOK, gin.H{ "content": content, }) }
Dalam kod di atas, kami menggunakan fungsi FormFile
rangka kerja Gin untuk membaca fail imej yang dimuat naik. Kami kemudiannya menyahkod kandungan fail melalui fungsi png.Decode
dan menggunakan fungsi go-qrcode
dalam pustaka qrcode.Decode
untuk mengeluarkan kandungan yang dinyahkod kepada klien sebagai respons.
Selepas langkah di atas selesai, kami menulis kod lengkap, seperti berikut:
package main import ( "bytes" "net/http" "strconv" "github.com/gin-gonic/gin" "github.com/fogleman/gg" "github.com/skip2/go-qrcode" ) func main() { r := gin.Default() // 生成二维码 r.GET("/qrcode", generateQRCode) // 扫描二维码 r.POST("/qrcode", scanQRCode) r.Run() } func generateQRCode(c *gin.Context) { // 获取传递的参数 content := c.Query("content") sizeStr := c.DefaultQuery("size", "256") // 将size参数转换为int类型 size, err := strconv.Atoi(sizeStr) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{ "error": err.Error(), }) return } // 生成二维码图片 qr, err := qrcode.New(content, qrcode.Medium) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{ "error": err.Error(), }) return } qr.DisableBorder = true img := qr.Image(size) // 将图片存储为PNG格式 buffer := new(bytes.Buffer) err = png.Encode(buffer, img) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{ "error": err.Error(), }) return } // 将图片作为响应输出给客户端 c.Data(http.StatusOK, "image/png", buffer.Bytes()) } func scanQRCode(c *gin.Context) { // 读取上传的图片文件 file, err := c.FormFile("file") if err != nil { c.JSON(http.StatusInternalServerError, gin.H{ "error": err.Error(), }) return } // 打开上传的文件 f, err := file.Open() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{ "error": err.Error(), }) return } defer f.Close() // 读取文件内容并解码 img, err := png.Decode(f) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{ "error": err.Error(), }) return } content, err := qrcode.Decode(img) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{ "error": err.Error(), }) return } // 将解码后的内容作为响应输出给客户端 c.JSON(http.StatusOK, gin.H{ "content": content, }) }
Dalam kod di atas, kami menggunakan Rangka kerja Gin mentakrifkan dua fungsi pemprosesan generateQRCode
dan scanQRCode
. Dalam fungsi generateQRCode
, kami menggunakan pustaka go-qrcode
untuk menjana kod QR dan menggunakan pustaka gg
untuk menjana imej format PNG. Dalam fungsi scanQRCode
, kami menghuraikan imej kod QR yang dimuat naik, membaca kandungan kod QR, dan akhirnya mengeluarkan kandungan tersebut kepada pelanggan sebagai respons melalui kaedah c.JSON
rangka kerja Gin. Kami menggunakan fungsi penghalaan rangka kerja Gin dalam fungsi utama untuk mentakrifkan permintaan GET dan POST di bawah laluan qrcode
yang sepadan dengan fungsi menjana kod QR dan mengimbas kod QR masing-masing.
Selepas melengkapkan kod di atas, kita boleh memulakan perkhidmatan melalui arahan berikut:
go run main.go
Kemudian akses http dalam penyemak imbas: //localhost:8080/qrcode?content=HelloWorld boleh menjana kod QR. Jika kita ingin mengimbas kod QR yang baru kita hasilkan, kita perlu terlebih dahulu menyimpan kod QR sebagai fail imej format PNG, dan kemudian gunakan alat seperti curl atau Postman untuk memuat naik fail imej, contohnya:
curl -X POST -F "file=@qrcode.png" http://localhost:8080/qrcode
Dengan cara ini, kami Anda boleh mendapatkan kandungan yang terkandung dalam kod QR dalam respons yang dikembalikan.
Setakat ini, kami telah berjaya melaksanakan penjanaan kod QR dan fungsi pengimbasan menggunakan rangka kerja Gin, yang memudahkan kerja pembangunan kami.
Atas ialah kandungan terperinci Gunakan rangka kerja Gin untuk melaksanakan penjanaan kod QR dan fungsi pengimbasan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!