add: helper functions
This commit is contained in:
parent
2374b8a839
commit
551c5cd7fb
61
captcha.go
61
captcha.go
|
@ -12,6 +12,7 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"math"
|
"math"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -193,3 +194,63 @@ func drawText(text string, img *image.NRGBA, opts *Options) error {
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
} else {
|
||||||
|
value = baseLightness + 0.25 + rng.Float64()*0.2
|
||||||
|
}
|
||||||
|
hue := float64(rng.Intn(361)) / 360
|
||||||
|
saturation := 0.6 + rng.Float64()*0.2
|
||||||
|
|
||||||
|
return hsva{h: hue, s: saturation, v: value, a: uint8(255)}
|
||||||
|
}
|
||||||
|
|
||||||
|
func getLightness(colour color.Color) float64 {
|
||||||
|
r, g, b, a := colour.RGBA()
|
||||||
|
// transparent
|
||||||
|
if a == 0 {
|
||||||
|
return 1.0
|
||||||
|
}
|
||||||
|
max := maxColor(r, g, b)
|
||||||
|
min := minColor(r, g, b)
|
||||||
|
|
||||||
|
l := (float64(max) + float64(min)) / (2 * 255)
|
||||||
|
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
|
||||||
|
func maxColor(numList ...uint32) (max uint32) {
|
||||||
|
for _, num := range numList {
|
||||||
|
colorVal := num & 255
|
||||||
|
if colorVal > max {
|
||||||
|
max = colorVal
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return max
|
||||||
|
}
|
||||||
|
|
||||||
|
func minColor(numList ...uint32) (min uint32) {
|
||||||
|
min = 255
|
||||||
|
for _, num := range numList {
|
||||||
|
colorVal := num & 255
|
||||||
|
if colorVal < min {
|
||||||
|
min = colorVal
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return min
|
||||||
|
}
|
||||||
|
|
||||||
|
func randomEquation() (text string, equation string) {
|
||||||
|
left := 1 + rng.Intn(9)
|
||||||
|
right := 1 + rng.Intn(9)
|
||||||
|
text = strconv.Itoa(left + right)
|
||||||
|
equation = strconv.Itoa(left) + "+" + strconv.Itoa(right)
|
||||||
|
|
||||||
|
return text, equation
|
||||||
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"golang.org/x/image/font/gofont/goregular"
|
"golang.org/x/image/font/gofont/goregular"
|
||||||
"image/color"
|
"image/color"
|
||||||
"testing"
|
"testing"
|
||||||
|
"math/rand"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestNewCaptcha(t *testing.T) {
|
func TestNewCaptcha(t *testing.T) {
|
||||||
|
@ -55,3 +56,49 @@ func TestLoadFont(t *testing.T) {
|
||||||
t.Fatal("LoadFont incorrectly parse an invalid font")
|
t.Fatal("LoadFont incorrectly parse an invalid font")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMaxColor(t *testing.T) {
|
||||||
|
var result uint32
|
||||||
|
result = maxColor()
|
||||||
|
if result != 0 {
|
||||||
|
t.Fatalf("Expect max color to be 0, got %v", result)
|
||||||
|
}
|
||||||
|
result = maxColor(1)
|
||||||
|
if result != 1 {
|
||||||
|
t.Fatalf("Expect max color to be 1, got %v", result)
|
||||||
|
}
|
||||||
|
result = maxColor(52428, 65535)
|
||||||
|
if result != 255 {
|
||||||
|
t.Fatalf("Expect max color to be 255, got %v", result)
|
||||||
|
}
|
||||||
|
var rng = rand.New(rand.NewSource(0))
|
||||||
|
for i := 0; i < 10; i++ {
|
||||||
|
result = maxColor(rng.Uint32(), rng.Uint32(), rng.Uint32())
|
||||||
|
if result > 255 {
|
||||||
|
t.Fatalf("Number out of range: %v", result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMinColor(t *testing.T) {
|
||||||
|
var result uint32
|
||||||
|
result = minColor()
|
||||||
|
if result != 255 {
|
||||||
|
t.Fatalf("Expect min color to be 255, got %v", result)
|
||||||
|
}
|
||||||
|
result = minColor(1)
|
||||||
|
if result != 1 {
|
||||||
|
t.Fatalf("Expect min color to be 1, got %v", result)
|
||||||
|
}
|
||||||
|
result = minColor(52428, 65535)
|
||||||
|
if result != 204 {
|
||||||
|
t.Fatalf("Expect min color to be 1, got %v", result)
|
||||||
|
}
|
||||||
|
var rng = rand.New(rand.NewSource(0))
|
||||||
|
for i := 0; i < 10; i++ {
|
||||||
|
result = minColor(rng.Uint32(), rng.Uint32(), rng.Uint32())
|
||||||
|
if result > 255 {
|
||||||
|
t.Fatalf("Number out of range: %v", result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Reference in New Issue