ホームページ >バックエンド開発 >Golang >Pin フレームワークを使用して QR コードの生成とスキャン機能を実装する

Pin フレームワークを使用して QR コードの生成とスキャン機能を実装する

王林
王林オリジナル
2023-06-23 08:18:091820ブラウズ

現代社会では、QR コードは情報伝達の一般的な方法になりました。情報を迅速に配信し、人々の生活を容易にすることができます。開発者にとって、QR コードを便利かつ迅速に生成してスキャンする方法は検討する必要がある問題です。この記事では、Ginフレームワークを利用してQRコードの生成・スキャン機能を実現する方法を紹介します。

  1. Gin フレームワークと関連ライブラリのインストール

まず、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 は画像を生成するライブラリです。

  1. QR コードの生成

次に、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 メソッドを使用します。画像を次の形式で保存します。 応答はクライアントに出力されます。

  1. QR コードをスキャンする

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 関数を使用して、デコードされたコンテンツを次のように出力します。クライアントへの応答。

  1. 完全なコード

上記の手順を完了した後、次のように完全なコードを作成します。

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 つの処理関数 generateQRCodescanQRCode を定義します。 generateQRCode 関数では、go-qrcode ライブラリを使用して QR コードを生成し、gg ライブラリを使用して PNG 形式の画像を生成します。 scanQRCode 関数では、アップロードされた QR コード画像を解析し、QR コードのコンテンツを読み取り、最後に、Gin フレームワークの c.JSON メソッドを介してコンテンツを応答として出力します。クライアント。 main 関数で、Gin フレームワークのルーティング関数を使用して、QR コードの生成と QR コードのスキャンの機能にそれぞれ対応する qrcode パスの下に GET リクエストと POST リクエストを定義します。

  1. 使用効果

上記のコードを完了したら、次のコマンドでサービスを開始できます:

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。