79 lines
1.6 KiB
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)
|
|
}
|