git.sophuwu.com > cdn   
              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)
}
*/