catbase/plugins/cowboy/cowboy_image.go

84 lines
1.9 KiB
Go

package cowboy
import (
"bytes"
"fmt"
"image"
"image/draw"
"image/png"
"os"
"path"
"github.com/nfnt/resize"
"github.com/velour/catbase/config"
"github.com/velour/catbase/plugins/emojy"
)
func getEmojy(c *config.Config, name string) (image.Image, error) {
files, _, err := emojy.AllFiles(c)
if err != nil {
return nil, err
}
fname, ok := files[name]
if !ok {
return nil, fmt.Errorf("could not find emojy: %s", name)
}
f, err := os.Open(fname)
if err != nil {
return nil, err
}
img, _, err := image.Decode(f)
if err != nil {
return nil, err
}
return img, nil
}
func getCowboyHat(c *config.Config) (image.Image, error) {
emojyPath := c.Get("emojy.path", "emojy")
p := path.Join(emojyPath, c.Get("cowboy.hatname", "hat.png"))
p = path.Clean(p)
f, err := os.Open(p)
if err != nil {
return nil, err
}
img, _, err := image.Decode(f)
if err != nil {
return nil, err
}
return img, nil
}
func cowboyifyImage(c *config.Config, input image.Image) (image.Image, error) {
hat, err := getCowboyHat(c)
if err != nil {
return nil, err
}
targetW := uint(c.GetInt("cowboy.targetw", 64))
hatW, hatH := float64(hat.Bounds().Max.X), float64(hat.Bounds().Max.Y)
newH := uint(float64(targetW) / hatW * hatH)
hat = resize.Resize(targetW, newH, hat, resize.MitchellNetravali)
input = resize.Resize(targetW, targetW, input, resize.MitchellNetravali)
dst := image.NewRGBA(image.Rect(0, 0, 64, 64))
draw.Draw(dst, input.Bounds(), input, image.Point{}, draw.Src)
draw.Draw(dst, hat.Bounds(), hat, image.Point{}, draw.Over)
return dst, nil
}
func cowboy(c *config.Config, name string) ([]byte, error) {
emojy, err := getEmojy(c, name)
if err != nil {
return nil, err
}
img, err := cowboyifyImage(c, emojy)
if err != nil {
return nil, err
}
w := bytes.NewBuffer([]byte{})
err = png.Encode(w, img)
if err != nil {
return nil, err
}
return w.Bytes(), nil
}