1 Star 0 Fork 0

Cruvie Kang / kk_go_kit

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
kk_image.go 2.72 KB
一键复制 编辑 原始数据 按行查看 历史
cruvie 提交于 2024-04-16 21:48 . update
package kk_image
import (
"bytes"
"errors"
"gitee.com/cruvie/kk_go_kit/kk_file"
"gitee.com/cruvie/kk_go_kit/kk_stage"
"log/slog"
"mime/multipart"
"os"
)
type TargetSize string
const (
Small TargetSize = "small"
Medium TargetSize = "medium"
Original TargetSize = "original"
)
type Image struct {
TargetSize TargetSize
TargetType kk_file.FileType
SourceType kk_file.FileType
data []byte
}
func NewImageFromFile(fileStream *os.File) (img *Image, err error) {
img = &Image{}
err = img.loadDataFromFile(fileStream)
if err != nil {
return nil, err
}
support, sourceType := img.checkType()
if !support {
return nil, errors.New("unsupported image type")
}
img.SourceType = sourceType
return img, nil
}
func NewImageFromFileHeader(fileHeader multipart.FileHeader) (img *Image, err error) {
img = &Image{}
err = img.loadDataFromFileHeader(fileHeader)
if err != nil {
return nil, err
}
support, sourceType := img.checkType()
if !support {
return nil, errors.New("unsupported image type")
}
img.SourceType = sourceType
return img, nil
}
func NewImageFromBuffer(buf []byte) (img *Image, err error) {
img = &Image{
data: buf,
}
support, sourceType := img.checkType()
if !support {
return nil, errors.New("unsupported image type")
}
img.SourceType = sourceType
return img, nil
}
func (img *Image) Copy() *Image {
newImg := &Image{
TargetSize: img.TargetSize,
TargetType: img.TargetType,
SourceType: img.SourceType,
}
newImg.data = make([]byte, len(img.data))
copy(newImg.data, img.data)
return newImg
}
func (img *Image) SetTargetSizeType(targetSize TargetSize, targetType kk_file.FileType) *Image {
img.TargetSize = targetSize
img.TargetType = targetType
return img
}
// Resize 生成文件流
func (img *Image) Resize() ([]byte, error) {
if img.TargetType == img.SourceType && img.TargetSize == Original {
return img.data, nil
}
switch img.TargetType {
case kk_file.Jpeg:
return img.resizeToJPEG()
case kk_file.Avif:
return img.resizeToAvif()
case kk_file.Gif:
return img.resizeToGif()
default:
return nil, errors.New("不支持的目标图片类型")
}
}
// GetResizedImage 获取压缩后用于上传的图片数据
func (img *Image) GetResizedImage() (uploadDataReader *bytes.Reader, err error) {
imageReader, err := img.Resize()
if err != nil {
return nil, err
}
uploadDataReader = bytes.NewReader(imageReader)
return uploadDataReader, nil
}
func (img *Image) CheckSize(maxSize kk_file.FileSize) (support bool) {
if len(img.data) > maxSize.Int() {
slog.Error("file size too large", kk_stage.NewLog(nil).
Any("size(MB)", kk_file.ConvertFileSizeMB(int64(len(img.data)))).
Any("limit(MB)", kk_file.ConvertFileSizeMB(maxSize.Int64())).Args()...)
return false
}
return true
}
1
https://gitee.com/cruvie/kk_go_kit.git
git@gitee.com:cruvie/kk_go_kit.git
cruvie
kk_go_kit
kk_go_kit
6c1fc534a942

搜索帮助

53164aa7 5694891 3bd8fe86 5694891