diff options
Diffstat (limited to 'pkg/fileop/thumbnail.go')
-rw-r--r-- | pkg/fileop/thumbnail.go | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/pkg/fileop/thumbnail.go b/pkg/fileop/thumbnail.go new file mode 100644 index 0000000..32f6064 --- /dev/null +++ b/pkg/fileop/thumbnail.go @@ -0,0 +1,60 @@ +package fileop + +import ( + "image" + "image/jpeg" + "os" + "os/exec" + + "github.com/disintegration/imaging" +) + +func EncodeImageThumbnail(inputPath string, outputPath string, width, height int) error { + inputImage, err := imaging.Open(inputPath, imaging.AutoOrientation(true)) + if err != nil { + return err + } + + thumbImage := imaging.Fit(inputImage, width, height, imaging.Lanczos) + if err = encodeImageJPEG(thumbImage, outputPath, 60); err != nil { + return err + } + + return nil +} + +func encodeImageJPEG(image image.Image, outputPath string, jpegQuality int) error { + photo_file, err := os.Create(outputPath) + if err != nil { + return err + } + defer photo_file.Close() + + err = jpeg.Encode(photo_file, image, &jpeg.Options{Quality: jpegQuality}) + if err != nil { + return err + } + + return nil +} + +func EncodeVideoThumbnail(inputPath string, outputPath string, width, height int) error { + args := []string{ + "-i", + inputPath, + "-vframes", "1", // output one frame + "-an", // disable audio + "-vf", "scale='min(1024,iw)':'min(1024,ih)':force_original_aspect_ratio=decrease:force_divisible_by=2", + "-vf", "select=gte(n\\,100)", + outputPath, + } + + cmd := exec.Command("ffmpeg", args...) + + if err := cmd.Run(); err != nil { + return err + } + + return nil + +} |