文章目录
- 前言
- 一、pillow库安装
- 二、pillow库使用
- 1、引入pillow库
- 2、图片打开、保存
- 3、图片处理
- 4、动态图片
- 三、函数封装
- 1、引入库
- 2、获取GIF帧数
- 3、拆分GIF,修改尺寸
- 4、连接图片
- 5、转换格式
- 6、修改大小
- 7、主函数
- 四、处理效果
- 总结
前言
pygame库只能展示图片的静态效果,要形成动态效果,可将GIF文件按帧提取拼接,循环展示。
Python的pillow库提供了简便的图片操作方法,包括图片尺寸修改、格式修改、区域剪切、粘贴等,让你不再为手动处理图片而苦恼。
一、pillow库安装
pip install pillow
在Python3.9中已经自带pillow库,无需安装。
二、pillow库使用
下面只介绍与素材处理有关的一些基本使用方法。
1、引入pillow库
from PIL import Image
2、图片打开、保存
im = Image.new("RGBA", (x, y)) #新建图片
image = Image.open("bean.jpg") #打开图片
print(image.size) #返回(长,宽)
image.show() #展示
image.save("flower.png") #保存图片
3、图片处理
region = (0, 0, 32, 32) #(左、上、右、下)
img = im.crop(region) #剪切
img = img.resize((x,y),Image.ANTIALIAS) #修改尺寸,抗锯齿
im.paste(img, region) #类似于blit方法,大小必须匹配
4、动态图片
im.tell() #返回当前帧数
im.seek(1)#选择帧数
三、函数封装
下面对常用素材处理所需的功能进行函数封装,可根据需要选择相应的函数。
1、引入库
from PIL import Image
2、获取GIF帧数
def TELL(fname):
im = Image.open(fname)
try:
while True:
im.seek(im.tell()+1)
except Exception as e:
print(e)
pass
print("共{}帧".format(im.tell()+1))
return im.tell()+1
3、拆分GIF,修改尺寸
def SEEK(fname, path, x, y, name, num, t):
im = Image.open(fname)
try:
i = 0
j = TELL(fname)//num
while i < num:
im.seek(i*j)
img = im.resize((x,y), Image.ANTIALIAS)
img.save(path + name + str(i) + "."+ t)
print("已读取{}项".format(i+1))
i += 1
except Exception as e:
print(e)
pass
print("读取完毕")
4、连接图片
def PASTE(path, x, y, name, num, t):
target = Image.new("RGBA", (x*num, y))
for i in range(num):
try:
im = Image.open(path + name + str(i)+ "."+ t)
im = im.resize((x,y), Image.ANTIALIAS)
region = (i*x, 0, (i+1)*x, y)
target.paste(im, region)
except Exception as e:
print(e)
pass
add = "_{}x{}_{}.png".format(x, y, num)
target.save(path + name + add)
print("合并完毕")
5、转换格式
def TRANS(fname, t):
im = Image.open(fname)
path = fname.split(".")[0]+"."+t
im.save(path)
print("转换完毕")
6、修改大小
def SIZE(fname, x, y, name, t):
im = Image.open(fname)
im = im.resize((x,y), Image.ANTIALIAS)
add = "_{}x{}.png".format(x, y)
im.save(path + name + add)
print("转换完毕")
7、主函数
def main(fname, path, x, y, name, num, t): #(原文件地址,新文件路径,目标宽度,目标高度,数目,目标格式)
#TELL(fname) #返回GIF帧数
#SEEK(fname, path, x, y, name, num, t) #拆分GIF,修改尺寸
#PASTE(path, x, y, name, num, t) #合并图片
#TRANS(fname, t) #转换格式
#SIZE(fname, x, y, name, t) #修改大小
if __name__ == "__main__":
fname = "C:/Users/lenovo/Desktop/py/代码/游戏开发/动起来/data/flower.gif"
path = "C:/Users/lenovo/Desktop/py/代码/游戏开发/动起来/data/"
name = "flower"
x,y =100,100
num = 5
t = "png"
main(fname, path, x, y, name, num, t)
四、处理效果
原图
运行结果
总结
- pygame无法直接展示动态图片,需要把动态图片截取为图片序列,Python遇到的问题要用Python解决。
- pillow库的对图片素材操作非常简便,易于上手。
- 根据实际需要选择使用上面的函数或者加以修改可以简单地处理游戏素材,不再依靠图片处理软件。
- 处理gif文件时,可先用TELL获得帧数,再用SEEK和PASTE获得图片序列。