95 lines
1.7 KiB
Go
95 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"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)
|
|
fmt.Printf("failed to load image %v", 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
|
|
}
|