89
package imgconv
import (
"bytes"
"fmt"
"github.com/nfnt/resize"
"image/gif"
"strings"
// "gocv.io/x/gocv"
"golang.org/x/image/webp"
"image"
"image/jpeg"
"image/png"
"io"
"path/filepath"
)
// ffmpeg -i file.mp4 -vf "select='eq(n\,20)+eq(n\,40)+eq(n\,60)+eq(n\,80)'" -vsync 0 frame%d.png
func scaleEncode(img image.Image) ([]byte, error) {
var w, h uint
aspect := float64(img.Bounds().Dx()) / float64(img.Bounds().Dy())
if aspect > 1 {
w = 128
h = uint(float64(w) / aspect)
} else {
h = 128
w = uint(float64(h) * aspect)
}
img = resize.Resize(w, h, img, resize.NearestNeighbor)
var buf bytes.Buffer
err := png.Encode(&buf, img)
if err != nil {
return nil, fmt.Errorf("failed to encode image to PNG: %v", err)
}
return buf.Bytes(), nil
}
func Media2Icon(path string, file io.Reader) ([]byte, error) {
var img image.Image
var err error
switch strings.ToLower(filepath.Ext(path)) {
case ".jpg", ".jpeg":
img, err = jpeg.Decode(file)
break
case ".png":
img, err = png.Decode(file)
break
case ".webp":
img, err = webp.Decode(file)
break
case ".gif":
img, err = gif.Decode(file)
break
default:
err = fmt.Errorf("unsupported image format: %s", filepath.Ext(path))
}
if err != nil {
return nil, fmt.Errorf("error decoding image: %v", err)
}
return scaleEncode(img)
}
/*
func getFirstFrameAsPNGBytes(videoPath string) ([]byte, error) {
// Open the video file
video, err := gocv.VideoCaptureFile(videoPath)
if err != nil {
return nil, fmt.Errorf("error opening video: %v", err)
}
img := gocv.NewMat()
ok := video.Read(&img)
if !ok || img.Empty() {
img.Close()
video.Close()
return nil, fmt.Errorf("failed to read the first frame")
}
imgImg, err := img.ToImage()
img.Close()
video.Close()
if err != nil {
return nil, fmt.Errorf("failed to convert frame to image: %v", err)
}
return scaleEncode(imgImg)
}
*/