admin管理员组

文章数量:1794759

《Python游戏趣味编程》 第13章 趣味图像生成

《Python游戏趣味编程》 第13章 趣味图像生成

13 趣味图片生成

图书简介可以看这里:

童晶:《Python游戏趣味编程》新书上架了

本章我们将学习Python的第三方图像处理库Pillow,编写代码生成一些趣味图像,效果如图13-1所示。首先学习图像文件的打开与显示、图像的剪裁与保存;接着学习图像的复制与粘贴、像素颜色的读写;最后实现随机互动的风格图片生成。

本章案例最终代码一共70行,代码参看:配套资源\\第13章\\13-5-3.py,视频效果参看:配套资源\\第13章\\趣味图片生成.mp4。

from 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() # 开始执行游戏

 

分步骤代码、图片素材、讲解视频可以从异步社区下载:

www.epubit/bookDetails?id=UB72096d97d6149

分步骤代码也可以直接从这里下载:

联想Filez

 

这一章了解了转义字符、异常处理、多行注释等知识,学习了图像处理的基本概念,结合图像处理库Pillow与游戏开发库Pygame Zero,生成了各种各样的趣味图像。读者可以阅读Pillow官网上的帮助文档,进行更多图像处理的实验。也可以参考本章的思路,快速了解、学习、应用其他Python标准库与第三方库。

 

本文标签: 趣味图像游戏Python