Golang图片验证码的使用
以下是一个简单的Golang程序,用于生成一个简单的图片验证码,并将其作为响应返回给客户端。
package main
import (
"bytes"
"image"
"image/color"
"image/png"
"io"
"log"
"math/rand"
"net/http"
"strconv"
"time"
"github.com/golang/freetype"
"golang.org/x/image/font"
"golang.org/x/image/math/fixed"
)
func main() {
http.HandleFunc("/captcha", captchaHandler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
func captchaHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "image/png")
width, height := 240, 60
// 创建一张图片
img := image.NewNRGBA(image.Rect(0, 0, width, height))
// 创建一个点进行填充
red := color.RGBA{R: 255, A: 255}
white := color.RGBA{R: 255, G: 255, B: 255, A: 255}
blue := color.RGBA{B: 255, A: 255}
// 填充背景为白色
for x := 0; x < width; x++ {
for y := 0; y < height; y++ {
img.Set(x, y, white)
}
}
// 生成随机数
rand.Seed(time.Now().UnixNano())
code := ""
for i := 0; i < 4; i++ {
num := rand.Intn(10)
code += strconv.Itoa(num)
// 将数字画在图片上
drawCode(img, width/5*i, red, num)
}
// 画一些干扰线
for i := 0; i < 5; i++ {
drawLine(img, red)
}
// 写入验证码
drawCaptcha(img, code, blue)
// 输出图片
err := png.Encode(w, img)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
func drawCaptcha(img *image.NRGBA, code string, blue color.RGBA) {
point := fixed.Point26_6{
X: (fixed.I(img.Bounds().Dx()) - font.MeasureString(code).Ceil()) / 2,
Y: (fixed.I(img.Bounds().Dy()) - font.Metric('m').Bounds.Ceil()) / 2,
}
d := &font.Drawer{
Dst: img,
Src: image.NewUniform(blue),
Face: basicfont.Face7x13,
Dot: point,
}
d.DrawString(code)
}
func drawCode(img *image.NRGBA, y int, red color.RGBA, num int) {
for i := 0; i < 40; i++ {
img.Set(i+rand.Intn(10)+y, rand.Intn(height/5)+y, color.RGBA{R: red.R, G: red.G, B: red.B, A: 255})
}
fontSize := 20.0
font := truetype.NewFace(basicfont.TTF, &truetype.Options{
Size: fontSize,
DPI: 72,
评论已关闭