图书简介可以看这里:
童晶:《Python游戏趣味编程》新书上架了 zhuanlan.zhihu.com本章我们将学习Python的第三方图像处理库Pillow,编写代码生成一些趣味图像,效果如图13-1所示。首先学习图像文件的打开与显示、图像的剪裁与保存;接着学习图像的复制与粘贴、像素颜色的读写;最后实现随机互动的风格图片生成。
本章案例最终代码一共70行,代码参看:配套资源\第13章\13-5-3.py,视频效果参看:配套资源\第13章\趣味图片生成.mp4。
知乎视频 www.zhihu.comfrom PIL import Image # 导入图像处理库
import pgzrun # 导入游戏库
import random # 导入随机库
im = Image.open("images\\image2.jpg") # 打开图像文件
w, h = im.size # 获得图像文件尺寸
WIDTH = w # 设置窗口的宽度
HEIGHT = h # 设置窗口的高度
px = im.load() # 导入图片像素
XY = [] # 列表中存储点坐标
RGB = [] # 列表中存储对应的像素颜色值
key = 1 # 定义按了哪个数字键,缺省为1
r = 3 # 定义了绘制小基本元素的大小,受鼠标左右移动控制
def update(): # 更新模块,每帧重复操作
global key
# 按下键盘数字键后,对key赋相应的值
if keyboard.k_1:
key = 1
elif keyboard.k_2:
key = 2
elif keyboard.k_3:
key = 3
elif keyboard.k_4:
key = 4
elif keyboard.k_5:
key = 5
elif keyboard.k_6:
key = 6
elif keyboard.escape:
key = -1
XY.clear() # 清空坐标列表
RGB.clear() # 清空颜色列表
for i in range(100):
x = random.randint(0, w-1) # 取随机坐标
y = random.randint(0, h-1)
r, g, b = px[x, y] # 取对应图片像素的颜色
XY.append((x, y)) # 将位置信息添加到列表中
RGB.append((r, g, b)) # 将颜色信息添加到列表中
def draw(): # 绘制模块,每帧重复执行
if key == -1: #当鼠标右键按下时
screen.clear() # 清除屏幕
for i in range(100):
x = XY[i][0] # 当前点坐标
y = XY[i][1]
box = Rect((x,y),(r,r)) # 画正方形区域的范围
if key == 1: # 绘制填充圆
screen.draw.filled_circle(XY[i], r, RGB[i])
if key == 2: # 绘制空心圆
screen.draw.circle(XY[i], r, RGB[i])
if key == 3: # 绘制线条
screen.draw.line((x, y), (x+r, y+r), RGB[i])
if key == 4: # 绘制两条线条组成的叉号
screen.draw.line((x-r, y-r), (x+r, y+r), RGB[i])
screen.draw.line((x-r, y+r), (x+r, y-r), RGB[i])
if key == 5: # 绘制空心正方形
screen.draw.rect(box, RGB[i])
if key == 6: # 绘制实心正方形
screen.draw.filled_rect(box, RGB[i])
def on_mouse_move(pos, rel, buttons): # 当鼠标移动时
global r
x = pos[0] # 鼠标的x坐标
r = x*10//WIDTH + 1 # 鼠标在最左边r=1,最右边r=10
if mouse.RIGHT in buttons: # 当鼠标右键按下时,准备清屏
key == -1
pgzrun.go() # 开始执行游戏
练习13-6:尝试生成如图13-17所示的趣味错觉图像:
import pgzrun # 导入游戏库
r = 4 # 白色小球半径
h_gray = r*2 # 灰色长条的高
# 两个白色小球之间的间隔、也是两个灰色长条间的间隔
step = r * 15
WIDTH = 12*step + 3*h_gray # 设置窗口的宽度
HEIGHT = 8*step + 3*h_gray # 设置窗口的高度
def draw(): # 绘制模块,每帧重复执行
screen.fill('black') # 黑色背景
# 画灰色长方形
for i in range(h_gray, HEIGHT-h_gray, step): # 画出水平的多个灰色长方形
box = Rect((0, i), (WIDTH, h_gray))
screen.draw.filled_rect(box, (150, 150, 150))
for i in range(h_gray, WIDTH-h_gray, step): # 画出竖直的多个灰色长方形
box = Rect((i, 0), (h_gray, HEIGHT))
screen.draw.filled_rect(box, (150, 150, 150))
# 画白色小圆圈
for i in range(h_gray, HEIGHT-h_gray, step):
for j in range(h_gray, WIDTH-h_gray, step):
screen.draw.filled_circle((j+r, i+r), h_gray, 'white')
pgzrun.go() # 开始执行游戏
分步骤代码、图片素材、讲解视频可以从异步社区下载:
https://www.epubit.com/bookDetails?id=UB72096d97d6149 www.epubit.com这一章了解了转义字符、异常处理、多行注释等知识,学习了图像处理的基本概念,结合图像处理库Pillow与游戏开发库Pygame Zero,生成了各种各样的趣味图像。读者可以阅读Pillow官网上的帮助文档,进行更多图像处理的实验。也可以参考本章的思路,快速了解、学习、应用其他Python标准库与第三方库。
来源:oschina
链接:https://my.oschina.net/u/4370323/blog/4320474