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