批量把PSD文件转换成PNG文件
最近在Unity开发过程中,遇到要把大量PSD文件转成PNG文件,很多在线网站都提供这种功能,但无法做到批量处理,所以自己用Go写了一个程序来。
第一部分 PSD转PNG
这里主要用到github.com/oov/psd这个库
//把PSD转换成PNG
func convertPNG(oldName string) bool {
file, err := os.Open(oldName)
if err != nil {
return false
}
defer file.Close()
img, _, err := image.Decode(file)
if err != nil {
return false
}
newName := strings.Replace(oldName, ".psd", ".png", 1)
out, err := os.Create(newName)
if err != nil {
return false
}
err = png.Encode(out, img)
if err != nil {
return false
}
return true
}
第二部分 递归目录
这里主要是递归目录,循环处理每个文件,psd.meta文件是Unity特有的,如果你的目录只有psd文件,可以把对应的psd.meta文件代码注释掉,不注释也照样可以跑。
//重命名文件
func renameFile(dirPath string) bool {
wg.Add(1)
defer wg.Done()
dir, err := ioutil.ReadDir(dirPath)
if err != nil {
fmt.Println(err)
return false
}
pthSep := string(os.PathSeparator)
for _, file := range dir {
if file.IsDir() {
//递归目录
fileName := dirPath + pthSep + file.Name()
go renameFile(fileName)
} else {
//psd.meta文件
if ok := strings.HasSuffix(file.Name(), ".psd.meta"); ok {
fileName := dirPath + pthSep + file.Name()
newName := strings.Replace(fileName, ".psd.meta", ".png.meta", 1)
os.Rename(fileName, newName)
}
//.psd文件
if ok := strings.HasSuffix(file.Name(), ".psd"); ok {
fileName := dirPath + pthSep + file.Name()
if !convertPNG(fileName) {
fmt.Println(fileName)
return false
}
os.Remove(fileName)
}
}
}
return true
}
第三部分 main函数
为了提高效率,代码使用了协程处理每个子目录,所以这里定义了一个全局WaitGroup变量,用来等待协程结束。
var wg sync.WaitGroup
func main() {
renameFile("./Sprites")
wg.Wait()
}
结束语
可能有些小伙伴没有Go环境,所以我已经生成了exe文件。请大家下载之后,在同级目录下创建Sprites文件夹,把要转换的psd文件放到该目录下面。
链接:https://pan.baidu.com/s/1tRLTstfuA78jxk-xyJsqfQ
提取码:206f
1+