Added image generation
This commit is contained in:
97
captchagen/captchagen.go
Normal file
97
captchagen/captchagen.go
Normal file
@ -0,0 +1,97 @@
|
||||
package captchagen
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"image"
|
||||
"image/color"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"math/rand"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/fogleman/gg"
|
||||
)
|
||||
|
||||
type Logo struct {
|
||||
Image image.Image
|
||||
IsCorrect bool
|
||||
}
|
||||
|
||||
type Captcha struct {
|
||||
Image image.Image
|
||||
CorrectAnswer int
|
||||
}
|
||||
|
||||
var Logos []Logo = []Logo{}
|
||||
|
||||
func initImage() *gg.Context {
|
||||
dc := gg.NewContext(600, 400)
|
||||
if err := dc.LoadFontFace("./assets/font.ttf", 24); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
grad := gg.NewLinearGradient(0, 0, 600, 400)
|
||||
grad.AddColorStop(0, color.RGBA{71, 100, 106, 255})
|
||||
grad.AddColorStop(1, color.RGBA{44, 43, 51, 255})
|
||||
|
||||
dc.SetFillStyle(grad)
|
||||
dc.DrawRectangle(0, 0, 600, 400)
|
||||
dc.Fill()
|
||||
return dc
|
||||
}
|
||||
|
||||
func GenCaptcha() Captcha {
|
||||
dc := initImage()
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
rand.Shuffle(len(Logos), func(i, j int) { Logos[i], Logos[j] = Logos[j], Logos[i] })
|
||||
correct_answer := 0
|
||||
count := len(Logos)
|
||||
for i, logo := range Logos {
|
||||
x := i*600/count + 50
|
||||
y := rand.Intn(400 - logo.Image.Bounds().Dy())
|
||||
dc.DrawImage(logo.Image, x, y)
|
||||
if logo.IsCorrect {
|
||||
correct_answer = i + 1
|
||||
}
|
||||
var tx float64 = float64(x) + 50.0
|
||||
var ty float64 = float64(y) + 120.0
|
||||
text := fmt.Sprintf("%d", i+1)
|
||||
dc.SetRGB(1, 1, 1)
|
||||
dc.DrawStringAnchored(text, tx, ty, 0.5, 0.5)
|
||||
}
|
||||
img := dc.Image()
|
||||
captcha := Captcha{
|
||||
Image: img,
|
||||
CorrectAnswer: correct_answer,
|
||||
}
|
||||
|
||||
return captcha
|
||||
}
|
||||
|
||||
func InitImages() error {
|
||||
images := []Logo{}
|
||||
files, err := ioutil.ReadDir("./assets")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, file := range files {
|
||||
|
||||
name := file.Name()
|
||||
if !strings.HasSuffix(name, ".png") {
|
||||
continue
|
||||
}
|
||||
log.Printf("%s", name)
|
||||
path := fmt.Sprintf("./assets/%s", name)
|
||||
im, err := gg.LoadPNG(path)
|
||||
if err != nil {
|
||||
log.Print(err)
|
||||
return err
|
||||
}
|
||||
is_correct := strings.HasPrefix(name, "godot")
|
||||
logo := Logo{Image: im, IsCorrect: is_correct}
|
||||
images = append(images, logo)
|
||||
}
|
||||
Logos = images
|
||||
log.Printf("%v", Logos)
|
||||
return nil
|
||||
}
|
Reference in New Issue
Block a user