1 Star 0 Fork 0

Cruvie Kang / kk_go_kit

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
kk_image_tool.go 5.02 KB
一键复制 编辑 原始数据 按行查看 历史
Cruvie 提交于 2024-04-16 12:53 . update
package kk_image
import (
"gitee.com/cruvie/kk_go_kit/kk_file"
"github.com/davidbyttow/govips/v2/vips"
"io"
"mime/multipart"
"os"
)
const (
imageQuality int = 80
imageLossless bool = false //无损,如果为true,则忽略质量设置
imageEncodeSpeed int = 5 //速度0-9 0最慢图片体积最小,9最快图片体积最大
imageStripMetadata bool = false //去除元数据
)
const (
smallWidth int = 400
middleWidth int = 690
)
func (img *Image) loadDataFromFile(fileStream *os.File) error {
buf, err := io.ReadAll(fileStream)
if err != nil {
return err
}
img.data = buf
return nil
}
func (img *Image) loadDataFromFileHeader(fileHeader multipart.FileHeader) error {
//创建临时文件
//tempFile, err := os.CreateTemp("", "temp")
//if err != nil {
// slog.Error("create temp file failed", kk_stage.NewLog(stage).Error(err).Args()...)
// return nil, err
//}
//defer func() {
// // 删除临时文件
// err = os.Remove(tempFile.Name())
// if err != nil {
// slog.Error("delete temp file failed", kk_stage.NewLog(stage).Error(err).Args()...)
// }
//}()
file, err := fileHeader.Open()
if err != nil {
return err
}
//重置文件指针
_, err = file.Seek(0, 0)
if err != nil {
return err
}
////将文件写入临时文件
//_, err = io.Copy(tempFile, file)
//if err != nil {
// slog.Error("copy file to temp file failed", kk_stage.NewLog(stage).Error(err).Args()...)
// return nil, err
//}
all, err := io.ReadAll(file)
if err != nil {
return err
}
img.data = all
return nil
}
func (img *Image) resizeToAvif() ([]byte, error) {
imgFile, err := img.readImageData()
if err != nil {
return nil, err
}
resizedImg, err := img.resizeLimitWidth(imgFile)
if err != nil {
return nil, err
}
ep := vips.NewAvifExportParams()
imageType := kk_file.DetectTypeByBytes(img.data)
// 如果为png,设置无损
if imageType == kk_file.Png.ContentType {
ep.Quality = 100
ep.Lossless = true
ep.Speed = imageEncodeSpeed //速度0-9 0最慢图片体积最小,9最快图片体积最大
ep.StripMetadata = imageStripMetadata
} else {
ep.Quality = imageQuality //质量1-100
ep.Lossless = imageLossless //无损,如果为true,则忽略质量设置
ep.Speed = imageEncodeSpeed //速度0-9 0最慢图片体积最小,9最快图片体积最大
ep.StripMetadata = imageStripMetadata //是否保留元数据
}
imageBytes, _, err := resizedImg.ExportAvif(ep)
if err != nil {
return nil, err
}
return imageBytes, nil
}
func (img *Image) resizeToJPEG() ([]byte, error) {
imgFile, err := img.readImageData()
if err != nil {
return nil, err
}
resizedImg, err := img.resizeLimitWidth(imgFile)
if err != nil {
return nil, err
}
ep := vips.NewJpegExportParams()
imageType := kk_file.DetectTypeByBytes(img.data)
// 如果是png,设置最佳
if imageType == kk_file.Png.ContentType {
ep.Quality = 100
ep.Interlace = true
ep.StripMetadata = false
} else {
ep.Quality = imageQuality //质量1-100
ep.Interlace = true
ep.StripMetadata = imageStripMetadata //保留元数据
}
imageBytes, _, err := resizedImg.ExportJpeg(ep)
if err != nil {
return nil, err
}
return imageBytes, nil
}
func (img *Image) resizeToGif() ([]byte, error) {
imgFile, err := img.readImageData()
if err != nil {
return nil, err
}
resizedImg, err := img.resizeLimitWidth(imgFile)
if err != nil {
return nil, err
}
ep := vips.NewGifExportParams()
if img.TargetSize == Original {
ep.Quality = 100
ep.StripMetadata = false
} else {
ep.Quality = imageQuality //质量1-100
ep.StripMetadata = imageStripMetadata //保留元数据
}
imageBytes, _, err := resizedImg.ExportGIF(ep)
if err != nil {
return nil, err
}
return imageBytes, nil
}
func (img *Image) readImageData() (*vips.ImageRef, error) {
importParams := vips.NewImportParams()
importParams.NumPages.Set(-1) //for gif
inputImage, err := vips.LoadImageFromBuffer(img.data, importParams)
if err != nil {
return nil, err
}
err = inputImage.AutoRotate()
if err != nil {
return nil, err
}
return inputImage, nil
}
func (img *Image) resizeLimitWidth(inputImage *vips.ImageRef) (*vips.ImageRef, error) {
width := inputImage.Width()
var scale float64
switch img.TargetSize {
case Small:
scale = float64(smallWidth) / float64(width)
case Medium:
scale = float64(middleWidth) / float64(width)
case Original:
return inputImage, nil // 原图
}
err := inputImage.Resize(scale, vips.KernelAuto)
if err != nil {
return nil, err
}
return inputImage, nil
}
func (img *Image) checkType() (support bool, imageType kk_file.FileType) {
// 判断文件类型
detectedType := kk_file.DetectTypeByBytes(img.data)
fileType := kk_file.New(detectedType)
//slog.Info("图片类型:", imageType)
switch fileType {
case kk_file.Heic:
return true, kk_file.Heic
case kk_file.Jpeg:
return true, kk_file.Jpeg
case kk_file.Png:
return true, kk_file.Png
case kk_file.Avif:
return true, kk_file.Avif
case kk_file.Gif:
return true, kk_file.Gif
default:
return false, kk_file.FileType{}
}
}
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