在游戏开发项目中,图片资源是最多的、占用空间也是最大的,因此我们需要降低图片的占用空间,我们用开源的软件pngquant来实现将32bit图片压缩为8bit的图片,关于pngquant,请戳:pngquant官网 , 我们只需要下载它的.exe文件就可以。
接下来是去python官网下载PIL(Python Image Library),因为我们需要它来检测png图片的格式。
准备好这些后,就可以写一个python脚本来实现了:
import os
import os.path
import Image
# Please reset the root directory Path !
ImageFilePath = "E:\Resources"
def getFilesAbsolutelyPath(ImageFilePath):
currentfiles = os.listdir(ImageFilePath)
filesVector = []
for file_name in currentfiles:
fullPath = os.path.join(ImageFilePath, file_name)
if os.path.isdir(fullPath):
newfiles = getFilesAbsolutelyPath(fullPath)
filesVector.extend(newfiles)
else:
filesVector.append(fullPath)
return filesVector
filePathVector = getFilesAbsolutelyPath(ImageFilePath)
pngFile = []
for filename in filePathVector:
flag = filename.find(".png")
if flag != -1:
im = Image.open(filename)
if im.mode != "P":
pngFile.append(filename)
print(mode)
# pngquant.exe path
pngquantPath = "E:\Resources\pngquant.exe -f --ext .png --quality 50-80 "
#get .Png File Name
for filename in pngFile:
os.system(pngquantPath + filename)
os.listdir(path),返回值是个list,存放了当前path目录下所有的文件/文件夹,os.path.join(path, file_name)会将当前的文件/文件名前面添加path根目录名,从而使文件名的路径为绝对路径; 然后通过os.path.isdir(fullpath)判断当前的file_name是否为一个目录,如果是目录,则递归处理它,最后得到的newfiles即为该目录下所有的文件名。
获取到所有的png文件后,需要判断文件当前是否经过pngquant处理了,im = Image.open(filename),打开文件后,im携带了文件的信息,im.mode值为一个str,如果png文件已经经过了pngquant处理,那么它的mode值为"P",否则为"RGBA", 我们将未处理过的图片保存到一个list中。
最后使用pngquant.exe来处理这些图片,pngquant参数如下:
-f 参数代表的意思为: overwrite existing output files,改写已经存在的文件,即我们需要将处理后的图片覆盖原来的图片。
--ext .png表示图片处理后的扩展名为.png
--quality 50-80 表示图片的质量最低为原来的50%,低于这个值将会出错。
我们用 E:\Resources\pngquant.exe -f --ext .png --quality 50-80 filename来处理每一个文件。
关于mode,PIL官网上这么写的:
1 (1-bit pixels, black and white, stored with one pixel per byte)
L (8-bit pixels, black and white)
P (8-bit pixels, mapped to any other mode using a colour palette)
RGB (3x8-bit pixels, true colour)
RGBA (4x8-bit pixels, true colour with transparency mask)
CMYK (4x8-bit pixels, colour separation)
YCbCr (3x8-bit pixels, colour video format)
I (32-bit signed integer pixels)
F (32-bit floating point pixels