From 02daf62bc0ce2f6bc18d0a0b4bb3388c5e70a76c Mon Sep 17 00:00:00 2001 From: Weilin Shi <934587911@qq.com> Date: Fri, 29 Sep 2017 09:32:04 +0800 Subject: [PATCH] update: tweak captcha color and position --- README.md | 2 ++ captcha.go | 17 +++++------------ example/captcha-math.png | Bin 0 -> 4116 bytes example/captcha.png | Bin 5565 -> 5790 bytes example/index.html | 3 ++- example/main.go | 13 ++++++++++++- 6 files changed, 21 insertions(+), 14 deletions(-) create mode 100644 example/captcha-math.png diff --git a/README.md b/README.md index 02c2a7d..8bca156 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,8 @@ func handle(w http.ResponseWriter, r *http.Request) { ## sample image ![image](example/captcha.png) +![image](example/captcha-math.png) + ## Contributing If your found a bug, please contribute! see [contributing.md](contributing.md) for more detail diff --git a/captcha.go b/captcha.go index bd22868..2634db7 100644 --- a/captcha.go +++ b/captcha.go @@ -174,7 +174,7 @@ func drawSineCurve(img *image.NRGBA, opts *Options) { if flip { yFlip = -1.0 } - curveColor := randomDarkColor() + curveColor := randomInvertColor(opts.BackgroundColor) for x1 := xStart; x1 <= xEnd; x1++ { y := math.Sin(math.Pi*angle*float64(x1)/float64(opts.width)) * curveHeight * yFlip @@ -182,14 +182,6 @@ func drawSineCurve(img *image.NRGBA, opts *Options) { } } -func randomDarkColor() hsva { - hue := float64(rng.Intn(361)) / 360 - saturation := 0.6 + rng.Float64()*0.2 - value := 0.25 + rng.Float64()*0.2 - - return hsva{h: hue, s: saturation, v: value, a: uint8(255)} -} - func drawText(text string, img *image.NRGBA, opts *Options) error { ctx := freetype.NewContext() ctx.SetDPI(92.0) @@ -199,13 +191,14 @@ func drawText(text string, img *image.NRGBA, opts *Options) error { ctx.SetFont(ttfFont) fontSpacing := opts.width / len(text) + fontOffset := rng.Intn(fontSpacing / 2) for idx, char := range text { fontScale := 1 + rng.Float64()*0.5 fontSize := float64(opts.height) / fontScale ctx.SetFontSize(fontSize) ctx.SetSrc(image.NewUniform(randomInvertColor(opts.BackgroundColor))) - x := fontSpacing*idx + fontSpacing/int(fontSize) + x := fontSpacing*idx + fontOffset y := opts.height/6 + rng.Intn(opts.height/3) + int(fontSize/2) pt := freetype.Pt(x, y) if _, err := ctx.DrawString(string(char), pt); err != nil { @@ -220,9 +213,9 @@ func randomInvertColor(base color.Color) color.Color { baseLightness := getLightness(base) var value float64 if baseLightness >= 0.5 { - value = baseLightness - 0.25 - rng.Float64()*0.2 + value = baseLightness - 0.3 - rng.Float64()*0.2 } else { - value = baseLightness + 0.25 + rng.Float64()*0.2 + value = baseLightness + 0.3 + rng.Float64()*0.2 } hue := float64(rng.Intn(361)) / 360 saturation := 0.6 + rng.Float64()*0.2 diff --git a/example/captcha-math.png b/example/captcha-math.png new file mode 100644 index 0000000000000000000000000000000000000000..74a93226b50cfa530f0333a42993ba4bc2428bb4 GIT binary patch literal 4116 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 literal 5565 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 LNkvXXu0mjfW-iOm diff --git a/example/index.html b/example/index.html index 096559f..ddf4f90 100644 --- a/example/index.html +++ b/example/index.html @@ -5,6 +5,7 @@ Captcha - captcha + captcha + captcha \ No newline at end of file diff --git a/example/main.go b/example/main.go index 4cb66dc..4e4472c 100644 --- a/example/main.go +++ b/example/main.go @@ -9,7 +9,8 @@ import ( func main() { http.HandleFunc("/", indexHandle) - http.HandleFunc("/captcha", captchaHandle) + http.HandleFunc("/captcha-default", captchaHandle) + http.HandleFunc("/captcha-math", mathHandle) fmt.Println("Server start at port 8080") err := http.ListenAndServe(":8080", nil) if err != nil { @@ -35,3 +36,13 @@ func captchaHandle(w http.ResponseWriter, _ *http.Request) { } img.WriteTo(w) } + +func mathHandle(w http.ResponseWriter, _ *http.Request) { + img, err := captcha.NewMathExpr(150, 50) + if err != nil { + fmt.Fprint(w, nil) + fmt.Println(err.Error()) + return + } + img.WriteTo(w) +}