vision/converter.go

79 lines
1.6 KiB
Go

package vision
import (
"fmt"
"path/filepath"
"strings"
"apigo.cc/go/file"
)
// Format 定义支持的图像格式
type Format string
const (
PNG Format = "png"
JPEG Format = "jpeg"
JPG Format = "jpg"
GIF Format = "gif"
)
// Convert 将图像文件转换为另一种格式
func Convert(srcPath, dstPath string, quality ...int) error {
c, err := Load(srcPath)
if err != nil {
return err
}
return Save(c, dstPath, quality...)
}
// ConvertAll 将目录下的所有符合条件的图片转换为目标格式
func ConvertAll(srcDir, dstDir string, toExt string, quality ...int) (int, []error) {
files, err := file.ReadDir(srcDir)
if err != nil {
return 0, []error{err}
}
if err := file.Mkdir(dstDir); err != nil {
return 0, []error{err}
}
count := 0
var errors []error
for _, f := range files {
if f.IsDir {
continue
}
name := f.Name
ext := strings.ToLower(filepath.Ext(name))
if ext == ".png" || ext == ".jpg" || ext == ".jpeg" {
srcPath := filepath.Join(srcDir, name)
dstName := strings.TrimSuffix(name, ext) + "." + toExt
dstPath := filepath.Join(dstDir, dstName)
if err := Convert(srcPath, dstPath, quality...); err == nil {
count++
} else {
errors = append(errors, fmt.Errorf("file %s: %w", name, err))
}
}
}
return count, errors
}
// Optimize 优化图片大小 (通过调整质量或缩放)
func Optimize(path string, maxWidth int, quality int) error {
c, err := Load(path)
if err != nil {
return err
}
if c.Width() > maxWidth {
c.Fit(maxWidth, c.Height())
}
return Save(c, path, quality)
}