>백엔드 개발 >Golang >Gin 프레임워크를 사용하여 QR 코드 생성 및 스캔 기능 구현

Gin 프레임워크를 사용하여 QR 코드 생성 및 스캔 기능 구현

王林
王林원래의
2023-06-23 08:18:091824검색

현대사회에서 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은 Gin 프레임워크, go-qrcode는 QR 코드 생성을 위한 라이브러리, gg는 그림 생성을 위한 라이브러리입니다.

  1. 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 형식으로 저장하고 c.Data 메서드를 사용합니다. Gin 프레임워크는 클라이언트에 대한 응답으로 이미지를 출력합니다. content参数作为二维码的内容,同时也可以通过size参数来设置二维码的大小,默认值为256。我们使用go-qrcode库中的qrcode.New函数来生成二维码图片。我们还可以通过DisableBorder属性来去掉图片边框。最后,我们使用gg库中的png.Encode函数将图片以PNG格式进行存储,并通过Gin框架的c.Data方法将图片作为响应输出给客户端。

  1. 扫描二维码

在生成完二维码之后,我们需要编写扫描二维码的代码。我们可以在路由中添加一个扫描二维码的路由,其代码如下:

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框架来定义两个处理函数generateQRCodescanQRCode。在generateQRCode函数中,我们使用go-qrcode库生成了二维码,并使用gg库生成了PNG格式的图片。而在scanQRCode函数中,我们解析上传的二维码图片,并读取二维码内容,最后将内容通过Gin框架的c.JSON方法作为响应输出给客户端。我们在主函数中使用Gin框架的路由函数来定义了qrcode

    QR 코드 스캔
    1. QR 코드를 생성한 후 QR 코드를 스캔하려면 코드를 작성해야 합니다. 경로에 QR 코드를 스캔하기 위한 경로를 추가할 수 있으며 코드는 다음과 같습니다.
    go run main.go

    위 코드에서는 Gin 프레임워크의 FormFile 함수를 사용하여 업로드된 이미지 파일을 읽습니다. 그런 다음 png.Decode 함수를 통해 파일 콘텐츠를 디코딩하고 go-qrcode 라이브러리의 qrcode.Decode 함수를 사용하여 디코딩합니다. 디코딩된 콘텐츠를 클라이언트에 응답으로 출력합니다.

      전체 코드

      위 단계가 완료된 후 다음과 같이 전체 코드를 작성합니다.

      curl -X POST -F "file=@qrcode.png" http://localhost:8080/qrcode

      위 코드에서는 Gin 프레임워크를 사용하여 두 가지 처리 기능을 정의합니다QRCode 생성 및 scanQRCode. generateQRCode 함수에서는 go-qrcode 라이브러리를 사용하여 QR 코드를 생성하고 gg 라이브러리를 사용하여 PNG 형식 이미지를 생성합니다. . scanQRCode 함수에서는 업로드된 QR 코드 이미지를 구문 분석하고 QR 코드 내용을 읽은 후 마지막으로 Gin 프레임워크의 c.JSON 메서드를 통해 해당 내용을 응답으로 전달합니다. 클라이언트에게. 우리는 메인 함수에서 Gin 프레임워크의 라우팅 기능을 사용하여 각각 QR 코드 생성 및 QR 코드 스캔 기능에 해당하는 qrcode 경로 아래에 GET 및 POST 요청을 정의합니다. 🎜🎜🎜사용 효과🎜🎜🎜위 코드를 완성한 후 다음 명령을 통해 서비스를 시작할 수 있습니다. 🎜rrreee🎜그런 다음 브라우저에서 http://localhost:8080/qrcode?content=HelloWorld를 방문하여 바이너리 코드를 생성합니다. QR 코드. 방금 생성한 QR 코드를 스캔하려면 먼저 QR 코드를 PNG 형식 이미지 파일로 저장한 다음 컬이나 Postman과 같은 도구를 사용하여 이미지 파일을 업로드해야 합니다. 예: 🎜rrreee🎜여기서 방법을 사용하면 응답에서 QR 코드에 포함된 콘텐츠 가져오기를 반환할 수 있습니다. 🎜🎜이 시점에서 우리는 개발 작업을 용이하게 하는 Gin 프레임워크를 사용하여 QR 코드 생성 및 스캔 기능을 성공적으로 구현했습니다. 🎜

위 내용은 Gin 프레임워크를 사용하여 QR 코드 생성 및 스캔 기능 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.