代码拉取完成,页面将自动刷新
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
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。