golang 遍历并批量压缩图片

发布时间 2023-06-13 16:48:20作者: wsh3166Sir
package main

import (
	"bytes"
	"fmt"
	"image"
	"io/ioutil"
	"mylog"
	"os"
	"path"
	"github.com/nfnt/resize"
	_ "image/gif"
	"image/jpeg"
	_ "image/png"
)

func main() {

	//	GetFiles(".")
	pathslist := GetFiles2(".")

	mapRule := make(map[string]int)
	mapRule[".jpg"] = 1
	mapRule[".png"] = 1
	mapRule[".jpeg"] = 1
	for i, m := range pathslist {
		mylog.Println(i, "===>", m)
		ext := path.Ext(m)
		//	fmt.Println(ext)
		if mapRule[ext] == 1 {
			fmt.Println(m)
			old, err := os.ReadFile(m)
			if err != nil {
				fmt.Println(err)
			}
			new_pic := CompressImageResource(old)

			ioutil.WriteFile(m, new_pic, 0666)
		}
	}

}

// 默认最大高度
const MaxHeight uint = 1080

// 文件小于 200KB 或者不是jpeg/png格式,不再压缩
func CompressImageResource(data []byte) []byte {
	if len(data) < 1024*200 {
		return data
	}

	img, _, err := image.Decode(bytes.NewReader(data))
	if err != nil {
		mylog.Printf("jpeg png compress failed,err:%v", err)
		return data
	}
	// 修改图片的大小
	m := resize.Resize(0, MaxHeight, img, resize.Lanczos3)
	buf := bytes.Buffer{}

	// 修改图片的质量
	err = jpeg.Encode(&buf, m, &jpeg.Options{Quality: 85})
	if err != nil {
		mylog.Printf("jpeg compress failed,err:%v", err)
		return data
	}
	if buf.Len() > len(data) {
		return data
	}
	return buf.Bytes()
}

func GetFiles(folder string) {
	files, _ := ioutil.ReadDir(folder)
	for _, file := range files {
		if file.IsDir() {
			GetFiles(folder + "/" + file.Name())
		} else {
			fmt.Println(folder + "/" + file.Name() + ",扩展名:" + path.Ext(file.Name()))
		}
	}

}

func GetFiles2(folder string) []string {
	res := []string{}
	files, _ := ioutil.ReadDir(folder)
	for _, file := range files {
		if file.IsDir() {
			temp2 := GetFiles2(folder + "/" + file.Name())
			res = append(res, temp2...)
		} else {
			res = append(res, folder+"/"+file.Name())
			//	fmt.Println(folder + "/" + file.Name() + ",扩展名:" + path.Ext(file.Name()))

		}
	}

	return res
}

  

效果:遍历当前根目录,批量压缩图片

mylog是自定义的日志包

在压缩那步增加并发代码跑,可以大幅提高效率。