package utils import ( "bytes" "errors" "fmt" "github.com/exhibition-main/internal/msg" "github.com/nfnt/resize" "go.uber.org/zap" "image" "image/jpeg" "os" ) const ( CompressLimit = 1024 * 1024 * 1 MaxHeight uint = 600 ) func CheckDirPath(path string, create bool) (exists bool, err error) { exists = false if path == "" { err = errors.New(msg.INVALID_PARAMS) return } if _, err = os.Stat(path); os.IsNotExist(err) { if !create { return } if err = os.MkdirAll(path, os.ModePerm); err != nil { return } } exists = true return } // CompressJPG 压缩图片,并返回缩略图路径 func CompressJPG(dst string, newDst string) (err error) { filebytes, err := os.ReadFile(dst) if err != nil { return err } compressbytes := compressImageResource(filebytes) fo, err := os.Create(newDst) defer fo.Close() if err != nil { return err } _, err = fo.Write(compressbytes) if err != nil { return err } return nil } func compressImageResource(data []byte) []byte { if len(data) < CompressLimit { return data } img, _, err := image.Decode(bytes.NewReader(data)) if err != nil { return data } m := resize.Resize(0, MaxHeight, img, resize.Lanczos3) buf := bytes.Buffer{} err = jpeg.Encode(&buf, m, &jpeg.Options{Quality: 100}) if err != nil { zap.L().Error("compressImageResource Encode err", zap.Error(err)) return data } if buf.Len() > len(data) { return data } fmt.Println(buf.Len()) if buf.Len() >= CompressLimit { bytes := compressImageResource(buf.Bytes()) return bytes } return buf.Bytes() }