🍯 Glaze

package images

import (
	"bytes"
	"image"
	"image/draw"
	"image/jpeg"
	"io/ioutil"
	"log"
	"os"
	"path/filepath"
	"strings"

	"github.com/anthonynsimon/bild/transform"
)

// SupportedTypes are supported image extensions/formats.
var SupportedTypes = []string{
	".jpeg",
	".jpg",
	".png",
	// ".gif",
}

// IsSupported is a simple helper that checks if an extension is supported.
func IsSupported(extension string) bool {
	for _, supported := range SupportedTypes {
		if extension == supported {
			return true
		}
	}
	return false
}

func thumbnailGenerator(work <-chan string) {
	for filename := range work {
		thumbname := strings.TrimSuffix(filename, filepath.Ext(filename)) +
			"_th" + filepath.Ext(filename)
		if _, err := os.Stat("storage/" + thumbname); os.IsExist(err) {
			log.Printf(
				"Thumbnail %s already exists, skipping\n", "storage/"+thumbname,
			)
			continue
		}

		log.Printf(
			"Thumbnailing %s to %s\n", "storage/"+filename, "storage/"+thumbname,
		)

		srcFile, err := os.Open("storage/" + filename)
		if err != nil {
			log.Printf("could not open file: %s\n", err)
			continue
		}

		data, err := ioutil.ReadAll(srcFile)
		if err != nil {
			log.Printf("could not read file: %s\n", err)
			continue
		}
		srcFile.Close()

		img, _, err := image.Decode(bytes.NewReader(data))
		if err != nil {
			log.Printf("could not decode image: %s\n", err)
			continue
		}

		srcW := float64(img.Bounds().Dx())
		srcH := float64(img.Bounds().Dy())
		dstW, dstH := 160, 120
		if srcW > srcH {
			ratio := srcH / srcW
			dstH = int(float64(dstW) * ratio)
		} else {
			ratio := srcW / srcH
			dstW = int(float64(dstH) * ratio)
		}
		resized := transform.Resize(img, dstW, dstH, transform.Lanczos)
		thumbImg := image.NewRGBA(image.Rect(0, 0, 160, 120))
		draw.Draw(
			thumbImg, image.Rect(80-(dstW/2), 60-(dstH/2), 160, 120),
			resized, image.Point{}, draw.Src,
		)

		dstFile, err := os.Create("storage/" + thumbname)
		if err != nil {
			log.Printf("could not create image: %s\n", err)
			continue
		}
		err = jpeg.Encode(dstFile, thumbImg, nil)
		if err != nil {
			log.Printf("could not encode image: %s\n", err)
			continue
		}
		dstFile.Close()
	}
}