Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mula Pantas: Gunakan fungsi bahasa Go untuk melaksanakan fungsi penjanaan kod pengesahan imej mudah

Mula Pantas: Gunakan fungsi bahasa Go untuk melaksanakan fungsi penjanaan kod pengesahan imej mudah

王林
王林asal
2023-07-30 21:09:331659semak imbas

Tajuk: Mula Pantas: Menggunakan fungsi bahasa Go untuk melaksanakan fungsi penjanaan kod pengesahan imej yang ringkas

Dalam aplikasi rangkaian moden, kod pengesahan ialah langkah perlindungan keselamatan yang sangat penting. Ia menentukan sama ada pengguna adalah orang sebenar dengan menunjukkan kepada pengguna gambar dengan aksara rawak dan meminta pengguna memasukkan aksara yang mereka lihat. Dalam artikel ini, kami akan menggunakan fungsi bahasa Go untuk melaksanakan fungsi penjanaan kod pengesahan imej yang mudah.

Sebelum bermula, kita perlu memasang persekitaran pembangunan bahasa Go terlebih dahulu. Versi yang sepadan boleh dimuat turun dan dipasang di laman web rasmi https://golang.org/dl/.

Pertama, kami perlu mengimport beberapa pustaka bahasa Go Gunakan coretan kod berikut untuk mengimport perpustakaan yang anda perlu gunakan.

import (
    "fmt"
    "image"
    "image/color"
    "image/draw"
    "image/png"
    "math/rand"
    "os"
    "time"
)

Seterusnya, kami mentakrifkan fungsi untuk menjana aksara rawak. Kita boleh memilih untuk menggunakan aksara seperti nombor, huruf besar dan huruf kecil, dsb. sebagai aksara rawak yang dijana. Di sini kita mengambil nombor sebagai contoh Kodnya adalah seperti berikut:

func generateRandomCode(length int) string {
    rand.Seed(time.Now().UnixNano())
    code := ""
    for i := 0; i < length; i++ {
        code += fmt.Sprintf("%d", rand.Intn(10))
    }
    return code
}

Dalam fungsi ini, kita menggunakan fungsi Intn dalam pakej rand untuk menjana integer rawak antara 0 dan 9, menukarnya kepada rentetan dan menambahnya pada kod , sehingga panjang yang ditentukan dicapai.

Seterusnya, kami mentakrifkan fungsi untuk menjana imej kod pengesahan Kod adalah seperti berikut:

func generateCaptchaImage(code string) {
    // 创建一个空白图片
    imgWidth := 200
    imgHeight := 100
    bgColor := color.RGBA{220, 220, 220, 255}
    img := image.NewRGBA(image.Rect(0, 0, imgWidth, imgHeight))
    draw.Draw(img, img.Bounds(), &image.Uniform{bgColor}, image.ZP, draw.Src)

    // 设置字体样式
    fontFile, err := os.Open("font.ttf")
    if err != nil {
        fmt.Println("Open font file failed:", err)
        return
    }
    defer fontFile.Close()
    font, err := truetype.Parse(fontFile)
    if err != nil {
        fmt.Println("Load font failed:", err)
        return
    }
    fontSize := 50
    fontDPI := 72.0
    c := freetype.NewContext()
    c.SetDPI(fontDPI)
    c.SetFont(font)
    c.SetFontSize(float64(fontSize))
    c.SetClip(img.Bounds())
    c.SetDst(img)
    c.SetSrc(&image.Uniform{color.RGBA{0, 0, 0, 255}})

    // 在图片上绘制字符
    pt := freetype.Pt(10, 70)
    for _, ch := range code {
        _, err = c.DrawString(string(ch), pt)
        if err != nil {
            fmt.Println("Draw string failed:", err)
            return
        }
        pt.X += c.PointToFixed(float64(fontSize * 5 / 7))
    }

    // 保存图片到本地文件
    file, err := os.Create("captcha.png")
    if err != nil {
        fmt.Println("Create image file failed:", err)
        return
    }
    defer file.Close()
    err = png.Encode(file, img)
    if err != nil {
        fmt.Println("Encode image failed:", err)
        return
    }
    fmt.Println("Captcha image generated successfully.")
}

Dalam fungsi ini, kami mula-mula mencipta imej RGBA kosong dan menetapkan warna latar belakang. Selepas itu, kami menggunakan pakej truetype untuk membaca dan memuatkan fail fon tersuai dan menetapkan gaya teks. Kemudian, kami menggunakan jenis Konteks pakej freetype untuk melaksanakan operasi lukisan pada imej. Akhir sekali, kami menyimpan imej yang dijana secara tempatan.

Akhir sekali, kami menulis fungsi utama dan memanggil fungsi di atas untuk menjana imej kod pengesahan Kod lengkap adalah seperti berikut:

package main

import (
    "fmt"
    "image"
    "image/color"
    "image/draw"
    "image/png"
    "math/rand"
    "os"
    "time"

    "github.com/golang/freetype"
    "golang.org/x/image/font/gofont/goregular"
)

func generateRandomCode(length int) string {
    rand.Seed(time.Now().UnixNano())
    code := ""
    for i := 0; i < length; i++ {
        code += fmt.Sprintf("%d", rand.Intn(10))
    }
    return code
}

func generateCaptchaImage(code string) {
    imgWidth := 200
    imgHeight := 100
    bgColor := color.RGBA{220, 220, 220, 255}
    img := image.NewRGBA(image.Rect(0, 0, imgWidth, imgHeight))
    draw.Draw(img, img.Bounds(), &image.Uniform{bgColor}, image.ZP, draw.Src)

    font, err := freetype.ParseFont(goregular.TTF)
    if err != nil {
        fmt.Println("Load font failed:", err)
        return
    }
    fontSize := 50
    fontDPI := 72.0
    c := freetype.NewContext()
    c.SetDPI(fontDPI)
    c.SetFont(font)
    c.SetFontSize(float64(fontSize))
    c.SetClip(img.Bounds())
    c.SetDst(img)
    c.SetSrc(&image.Uniform{color.RGBA{0, 0, 0, 255}})

    pt := freetype.Pt(10, 70)
    for _, ch := range code {
        _, err = c.DrawString(string(ch), pt)
        if err != nil {
            fmt.Println("Draw string failed:", err)
            return
        }
        pt.X += c.PointToFixed(float64(fontSize * 5 / 7))
    }

    file, err := os.Create("captcha.png")
    if err != nil {
        fmt.Println("Create image file failed:", err)
        return
    }
    defer file.Close()
    err = png.Encode(file, img)
    if err != nil {
        fmt.Println("Encode image failed:", err)
        return
    }
    fmt.Println("Captcha image generated successfully.")
}

func main() {
    code := generateRandomCode(4)
    generateCaptchaImage(code)
}

Dalam fungsi utama, kami mula-mula menjana kod pengesahan 4 digit secara rawak dan memanggil generateCaptchaImage. berfungsi dalam baris seterusnya untuk menjana imej kod pengesahan.

Selepas melengkapkan langkah di atas, kita boleh melaksanakan arahan go run main.go dalam terminal untuk menjalankan program, dan ia akan menjana imej kod pengesahan bernama captcha.png.

Melalui contoh kod dalam artikel ini, kami mempelajari cara menggunakan fungsi bahasa Go untuk menjana kod pengesahan imej yang ringkas. Sudah tentu, dalam aplikasi sebenar, kami perlu menambah lebih banyak fungsi untuk melaksanakan pengesahan input pengguna, menyegarkan semula kod pengesahan dan fungsi lain, tetapi kod sampel yang ditunjukkan dalam artikel ini memberikan kami asas untuk permulaan pantas.

Saya harap dengan mempelajari artikel ini, anda dapat memahami fungsi penjanaan kod pengesahan imej menggunakan bahasa Go. Selamat berprogram!

Atas ialah kandungan terperinci Mula Pantas: Gunakan fungsi bahasa Go untuk melaksanakan fungsi penjanaan kod pengesahan imej mudah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn