83 lines
1.5 KiB
Go
83 lines
1.5 KiB
Go
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()
|
|
}
|