package main import ( "image" "log" "os" "path/filepath" "strings" "github.com/disintegration/gift" _ "image/jpeg" "image/png" _ "golang.org/x/image/webp" ) type ImageFilters struct { Colorize [3]float32 Contrast int Gamma float64 } func pickRandomImage(dir string) (string, error) { dir = config.Root + "/" + dir wd, err := os.Getwd() if err != nil { return "", err } randomImg, filename, _ := getRandomFile(dir) filenameNoExt := strings.TrimSuffix(filename, filepath.Ext(filename)) //check to see if rendered copy already exists fileExists, err := fileExistsInCache(filenameNoExt) if err != nil { return "", err } curr := wd + "/images/" + filenameNoExt if !fileExists { img, err := loadImage(randomImg) if err != nil { return "", err } dst := processImage(img, config) saveImage(curr, dst) } else { log.Println("file already exists in cache. skipping image processing") } return curr, nil } func loadImage(filename string) (image.Image, error) { f, err := os.Open(filename) if err != nil { return nil, err } defer f.Close() img, _, err := image.Decode(f) if err != nil { return nil, err } return img, nil } func saveImage(filename string, img image.Image) error { f, err := os.Create(filename) if err != nil { return err } defer f.Close() err = png.Encode(f, img) if err != nil { return err } return nil } func processImage(img image.Image, config Config) image.Image { cArgs := config.Colorize g := gift.New( gift.Colorize(cArgs[0], cArgs[1], cArgs[2]), gift.Contrast(float32(config.Contrast)), gift.Gamma(float32(config.Gamma)), ) dst := image.NewRGBA(g.Bounds(img.Bounds())) g.Draw(dst, img) return dst }