mirror of
https://github.com/woodchen-ink/webp_server_go.git
synced 2025-07-19 14:12:01 +08:00
feat(encoder): add NEF to JPG conversion and improve image processing workflow
This commit is contained in:
parent
059aba8a4d
commit
159e78f82e
@ -207,59 +207,64 @@ func ProcessAndSaveImage(rawImageAbs, exhaustFilename string, extraParams config
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 如果原始图像是 NEF 格式,先转换为 JPG
|
||||||
|
if strings.HasSuffix(strings.ToLower(rawImageAbs), ".nef") {
|
||||||
|
var convertedRaw, converted = ConvertRawToJPG(rawImageAbs, exhaustFilename)
|
||||||
|
if converted {
|
||||||
|
rawImageAbs = convertedRaw
|
||||||
|
defer func() {
|
||||||
|
log.Infoln("移除中间转换文件:", convertedRaw)
|
||||||
|
if err := os.Remove(convertedRaw); err != nil {
|
||||||
|
log.Warnln("删除转换文件失败", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 加载图像
|
// 加载图像
|
||||||
img, err := vips.LoadImageFromFile(rawImageAbs, &vips.ImportParams{
|
img, err := vips.LoadImageFromFile(rawImageAbs, &vips.ImportParams{
|
||||||
FailOnError: boolFalse,
|
FailOnError: boolFalse,
|
||||||
|
NumPages: intMinusOne,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warnf("加载图像失败: 文件=%s, 错误=%v", rawImageAbs, err)
|
log.Warnf("无法打开源图像: %v", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer img.Close()
|
defer img.Close()
|
||||||
|
|
||||||
// 调整图像大小
|
|
||||||
if err := resizeImage(img, extraParams); err != nil {
|
|
||||||
log.Warnf("调整图像大小失败: %v", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 移除元数据(如果配置要求)
|
|
||||||
if config.Config.StripMetadata {
|
|
||||||
log.Debug("正在移除图像元数据")
|
|
||||||
img.RemoveMetadata()
|
|
||||||
}
|
|
||||||
|
|
||||||
var buf []byte
|
|
||||||
var exportErr error
|
|
||||||
|
|
||||||
// 确定输出格式
|
// 确定输出格式
|
||||||
if strings.HasSuffix(exhaustFilename, ".avif") {
|
var imageType string
|
||||||
buf, _, exportErr = img.ExportAvif(vips.AvifExportParams{
|
switch {
|
||||||
Quality: config.Config.Quality,
|
case strings.HasSuffix(exhaustFilename, ".avif"):
|
||||||
})
|
imageType = "avif"
|
||||||
} else if strings.HasSuffix(exhaustFilename, ".jxl") {
|
case strings.HasSuffix(exhaustFilename, ".jxl"):
|
||||||
// 注意:govips 可能不直接支持 JXL 导出,这里使用 JPEG 作为替代
|
imageType = "jxl"
|
||||||
buf, _, exportErr = img.ExportJpeg(vips.JpegExportParams{
|
default:
|
||||||
Quality: config.Config.Quality,
|
imageType = "webp"
|
||||||
})
|
|
||||||
} else {
|
|
||||||
// 默认使用 WebP
|
|
||||||
buf, _, exportErr = img.ExportWebp(vips.WebpExportParams{
|
|
||||||
Quality: config.Config.Quality,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if exportErr != nil {
|
// 预处理图像(自动旋转、调整大小等)
|
||||||
log.Errorf("导出图像失败: %v", exportErr)
|
if err := preProcessImage(img, imageType, extraParams); err != nil {
|
||||||
return exportErr
|
log.Warnf("无法预处理源图像: %v", err)
|
||||||
}
|
|
||||||
|
|
||||||
// 写入文件
|
|
||||||
if err := os.WriteFile(exhaustFilename, buf, 0600); err != nil {
|
|
||||||
log.Errorf("写入目标文件失败: 文件=%s, 错误=%v", exhaustFilename, err)
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 根据图像类型进行编码
|
||||||
|
var encoderErr error
|
||||||
|
switch imageType {
|
||||||
|
case "webp":
|
||||||
|
encoderErr = webpEncoder(img, rawImageAbs, exhaustFilename)
|
||||||
|
case "avif":
|
||||||
|
encoderErr = avifEncoder(img, rawImageAbs, exhaustFilename)
|
||||||
|
case "jxl":
|
||||||
|
encoderErr = jxlEncoder(img, rawImageAbs, exhaustFilename)
|
||||||
|
}
|
||||||
|
|
||||||
|
if encoderErr != nil {
|
||||||
|
log.Errorf("图像编码失败: %v", encoderErr)
|
||||||
|
return encoderErr
|
||||||
|
}
|
||||||
|
|
||||||
log.Infof("图像处理成功: 目标文件=%s", exhaustFilename)
|
log.Infof("图像处理成功: 目标文件=%s", exhaustFilename)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user