go/img/img.go

76 lines
1.4 KiB
Go

package img
import (
"fmt"
"image"
"image/draw"
"image/png"
"os"
"os/exec"
"github.com/anthonynsimon/bild/adjust"
)
const (
StyleDark = -0.70
ffmpegBin = "/usr/bin/ffmpeg"
)
var ErrorFFMPEGBinaryNotFound = fmt.Errorf("ffmpeg binary not found: %s", ffmpegBin)
func CreateThumbnail(videoFile, thumbFilename string) (err error) {
// ffmpeg -i videoFile -ss 00:00:01.000 -vframes 1 output.png
cmd := exec.Command(ffmpegBin, "-i", videoFile, "-ss", "00:05:00.000", "-vframes", "1", thumbFilename)
_, err = cmd.Output()
if err != nil {
return ErrorFFMPEGBinaryNotFound
}
return nil
}
func Overlay(inputFile, overlayFile string, style float64) (err error) {
thumb, err := os.Open(inputFile)
if err != nil {
return err
}
overlay, err := os.Open(overlayFile)
if err != nil {
return err
}
img0, err := png.Decode(thumb)
if err != nil {
return err
}
defer thumb.Close()
img1, err := png.Decode(overlay)
if err != nil {
return err
}
defer overlay.Close()
b0 := img0.Bounds()
b1 := img1.Bounds()
img0 = adjust.Brightness(img0, style)
offset := image.Pt(b0.Dx()/2-b1.Dx()/2, b0.Dy()/2-b1.Dy()/2)
m := image.NewRGBA(b0)
draw.Draw(m, b0, img0, image.Point{}, draw.Src)
draw.Draw(m, img1.Bounds().Add(offset), img1, image.Point{}, draw.Over)
imgw, err := os.Create(inputFile)
if err != nil {
return err
}
png.Encode(imgw, m)
defer imgw.Close()
return nil
}