現代社会では、QR コードは情報伝達の一般的な方法になりました。情報を迅速に配信し、人々の生活を容易にすることができます。開発者にとって、QR コードを便利かつ迅速に生成してスキャンする方法は検討する必要がある問題です。この記事では、Ginフレームワークを利用してQRコードの生成・スキャン機能を実現する方法を紹介します。
まず、Gin フレームワークと関連ライブラリをインストールする必要があります。次のコマンドを実行してインストールを完了します。
go get -u github.com/gin-gonic/gin go get -u github.com/skip2/go-qrcode go get -u github.com/fogleman/gg
このうち、gin は Jin フレームワーク、go-qrcode は QR コードを生成するライブラリ、gg は画像を生成するライブラリです。
次に、QR コードを生成するコードを記述する必要があります。 QR コードを生成する関数を定義できます。コードは次のとおりです:
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()) }
上記のコードでは、渡された content
パラメータを QR コードのコンテンツとして読み取り、 size
パラメータを使用して QR コードのサイズを設定することもできます。デフォルト値は 256 です。 go-qrcode
ライブラリの qrcode.New
関数を使用して QR コード画像を生成します。 DisableBorder
属性を使用して画像の境界線を削除することもできます。最後に、gg
ライブラリの png.Encode
関数を使用して画像を PNG 形式で保存し、Gin フレームワークの c.Data
メソッドを使用します。画像を次の形式で保存します。 応答はクライアントに出力されます。
QR コードを生成した後、QR コードをスキャンするためのコードを記述する必要があります。ルート内に QR コードをスキャンするためのルートを追加できます。コードは次のとおりです。
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, }) }
上記のコードでは、Gin フレームワークの FormFile
関数を使用して、アップロードされたファイルを読み取ります。画像ファイル。次に、png.Decode
関数を通じてファイルのコンテンツをデコードし、go-qrcode
ライブラリの qrcode.Decode
関数を使用して、デコードされたコンテンツを次のように出力します。クライアントへの応答。
上記の手順を完了した後、次のように完全なコードを作成します。
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, }) }
上記のコードでは、 Gin フレームワークは、2 つの処理関数 generateQRCode
と scanQRCode
を定義します。 generateQRCode
関数では、go-qrcode
ライブラリを使用して QR コードを生成し、gg
ライブラリを使用して PNG 形式の画像を生成します。 scanQRCode
関数では、アップロードされた QR コード画像を解析し、QR コードのコンテンツを読み取り、最後に、Gin フレームワークの c.JSON
メソッドを介してコンテンツを応答として出力します。クライアント。 main 関数で、Gin フレームワークのルーティング関数を使用して、QR コードの生成と QR コードのスキャンの機能にそれぞれ対応する qrcode
パスの下に GET リクエストと POST リクエストを定義します。
上記のコードを完了したら、次のコマンドでサービスを開始できます:
go run main.go
次に、ブラウザで http にアクセスします。 //localhost:8080/qrcode?content=HelloWorld は QR コードを生成できます。生成した QR コードをスキャンしたい場合は、まず QR コードを PNG 形式の画像ファイルとして保存し、次に、curl や Postman などのツールを使用して画像ファイルをアップロードする必要があります。例:
curl -X POST -F "file=@qrcode.png" http://localhost:8080/qrcode
このようにして、返された応答の QR コードに含まれるコンテンツを取得できます。
これまでのところ、Gin フレームワークを使用して QR コードの生成とスキャン機能を実装することに成功しており、開発作業が容易になります。
以上がPin フレームワークを使用して QR コードの生成とスキャン機能を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。