最近在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+

本文为原创文章,转载请注明出处,欢迎访问作者网站(和而不同)

发表评论

error: Content is protected !!