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) }