在前面的几篇文章中,我们分享了一些用PyGame制作小游戏的教程。我们今天的分享使用的仍然是PyGame,只不过这次不是写游戏啦~我们要用PyGame制作一张马赛克版的蒙娜丽莎。

下载图片

下载蒙娜丽莎图片

这张图片将作为底图,我们要使用这张图片来制作马赛克效果。注意记下图片的像素尺寸,因为我们需要在之后的代码中用到这一像素尺寸。

将图片储存为“mona.jpg”

我们提供的图片尺寸是743像素 x 1155 像素的。请在开始写代码前确认图片是这个尺寸,否则之后的马赛克可能会出错。

编写主程序

1. 新建 .py文件

在Python IDE中新建一个名为”makeMona.py”的文件;我们在之后的代码中要使用这个文件名。

2. 导入库

和先前我们写游戏时一样,由于我们要使用PyGame库来显示(display)图片,并使用Math库来做必要的计算,我们要先使用import命令来把这两个库导入:

from pygame import * #导入Pygame库

from math import * #导入 Math库

3. 设置图片参数

在我们开始放置图片之前,我们要先创建一个画布。载入蒙娜丽莎的图片之后,她便能够显示在这张画布上。

我们要使用display.set_mode((743,1155))来对图片进行设置。(743,1155)表示画布的大小,这个大小和我们的蒙娜丽莎图片大小一致:

screen = display.set_mode((743,1155)) #设置画布尺寸

m = image.load("mona.jpg") #将底图存入变量m并加载底图

screen.blit(m,(0,0)) #以画布左上角为参考点放入底图

4. 为程序创建一个文件

在makeMona程序中,你需要创建一个新文件,并向新文件写入程序内容。

我们使用变量mon来指代这个新文件。在引号内,我们将这个新文件命名为“mona.py”。“w”表示你将要向这个新文件写入内容。

mon = open("mona.py", "w")

5. 初始化程序

你现在可以开始向mona.py写入内容了。在这里,你需要导入你将要使用的库并设定显示尺寸:

mon.write("""from pygame import *

from math import *

screen = display.set_mode((743,1155))

""") #使用三引号来标示要向新文件写入的代码

6. 在makeMona.py中显示图片

为了保证你的图片正确载入到程序中,你需要把图片显示到画布上:

running = True #让程序运行

display.flip() #显示图片

7. 制作马赛克图案

我们现在要把图片分割成小小的矩形,然后制作马赛克图案。为了在制作马赛克图案的同时保持图片的可识别性,我们把每个矩形大小定为5像素。

mon.write("draw.rect(screen,"+c+",("+str(x)+","+str(y)+",4,4)) ")是最需要注意的一行,我们把这行拆解为下面几个部分:

draw.rect(screen,"+c+"表示绘制马赛克单元,也就是画布上的单个小矩形。追加(append)的“c”与str(screen.get_at((x,y))相关,这部分代码让你给每个像素填上颜色。

("+str(x)+","+str(y)中的“x”和“y”代表矩形的位置。我们在这里使用str(),这是因为我们要让程序把x和y的值作为字符串读入(因为x和y的值将成为三引号内的多行字符串的一部分,它们的格式也必须是字符串)。

+",4,4)) ")中的两个4代表马赛克单元中有图片信息的部分,这将给每个马赛克单元留下一个黑边,这是使图片马赛克化的关键。“ ”是换行符,这个符号让程序换行,接下来写入的内容将从下一行开始写。

下面是这一部分的代码:

for x in range(0,743,5): #将马赛克单元x方向的边长定为5像素

for y in range(0,1155,5): #将马赛克单元y方向的边长定为5像素

c = str(screen.get_at((x,y))) #获取每个(x,y)坐标处的图像颜色

mon.write("draw.rect(screen,"+c+",("+str(x)+","+str(y)+",4,4)) ")

#把像素坐标写到mona.py文件中,划定有图像内容的矩形大小(4x4)

mon.write("display.flip() ") #显示图片

8. 创建while-running循环

和其他所有PyGame程序一样,我们要在mona.py里加上“while running”循环:

mon.write("""running = True

while running:

for evnt in event.get(): # checks all events that happen

if evnt.type == QUIT:

running = False

quit()""")

mon.close() #保存并关闭mona.py

检查并测试代码

所有的代码已经完成了!是不是很简单呢?在文末我们提供了这个程序的完整代码,只需扫描二维码就可以获取哦!

接下来我们要检查并运行我们的代码!

1. 打开mona.py

在你保存makeMona.py的位置,你也可以找到mona.py。

如果你打开这个文件,你会看到几百行代码。太神奇了!这些代码代表了马赛克的每一小块。每一行都表示一个小矩形。

打开这个文件可能需要几秒钟时间,这很正常,因为这个文件比较大。

2. 运行mona.py

现在如果你的代码没有什么问题,我们就可以进行最后一步了!运行mona.py,然后你就能看见的你自己做的马赛克版蒙娜丽莎了!

常见问题

在我们制作上面的马赛克时,很可能遇到一些小错误。下面是一些常见的错误及解决方法:

1. 找不到mona.py文件

在运行主程序makeMona.py之后,mona.py文件会出现在同一个文件夹中。

2. 新程序mona.py无法运行

所有要写入新程序的内容都需要放在三引号内。如果你的程序无法正常运行,检查这些部分,所有的括号、引号都应该是正确配对的。

3. 图片变形了

这很有可能是你设定的显示尺寸有误。确保你使用display.set_mode()设置的图片尺寸都是一样的。

python做图片-python做图相关推荐

  1. python切割图片地图切图脚本

    python切割图片地图切图脚本 ''' 读入一个图片,切成指定数目个小图片(64个) 文件夹名out ''' from PIL import Image import sys,os cut_num ...

  2. python去除图片水印_Python | 图中使用类的水印

    python去除图片水印 Sometimes, we need to add watermark as a standard category of plots and therefore, we a ...

  3. python将图片转换为灰度图

    灰度图的位深度为8,此代码使用PIL库中的convert函数进行转换. convert函数的参数解释: 1 ------------------(1位像素,黑白,每字节一个像素存储) L ------ ...

  4. python 实现图片转卡通图

    使用的是百度的API,我们可以进入百度AI开放平台,登录,然后 点 立即使用.创建应用 然后上代码: import base64 import requestsdef get_access_token ...

  5. android python 纠正图片,Python脚本替换Android资源(包名,图片,文件内容)

    最近要将Android项目中的gradle,图片,包名,字符串等做便捷替换,以适应不同内容的更换,于是搬出半生不熟的Python,通过一系列的文件操作达到目的.完整项目写在github上,欢迎fork ...

  6. python修改图片,Python之修改图片像素值的方法

    在做语义分割项目时,标注的图片不合标准,而且类型是RGBA型,且是A的部分表示的类别,因此需要将该图片转化为RGB图片 # -*- coding:utf8 -*- import os from PIL ...

  7. python界面图片-python图形用户界面(六):可视化给图片添加上文字

    前言 之前在图形处理系列课程中,讲过如何给图片添加上文字,尽管通过程序设定,已经可以实现文本自动居中的效果,人的需求是会不断变的,我们有时候可能并不想只放在中间,而是想要放到图片的任意一个位置,用原来 ...

  8. python界面图片-python实现读取并显示图片方法(不需要图形界面)

    在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片.本人偏爱 matpoltlib,因为它的语法更像 matlab. 一.matplotlib 1. ...

  9. python界面图片-python如何实现读取并显示图片(不需要图形界面)

    在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片.本人偏爱 matpoltlib,因为它的语法更像 matlab. 一.matplotlib 1. ...

最新文章

  1. BI.寒号鸟请吃烧烤/意外入手“speed- dear friends vol.1”/入手“鲍家街43号”/我爱红红/我爱红红...
  2. 获取汉字的首字母(转)
  3. Excel问题汇总!
  4. Linux下安装Tomcat
  5. pythonspark实例_spark+python快速入门实战小例子(PySpark)
  6. animate动画案例_animate动画案例——小小购物狂
  7. ubuntu16.04安装docker(阿里云镜像)
  8. java怎么实现打牌_JAVA入门第三季实战:简易扑克牌
  9. 鸿蒙os2.0怎么报名,我想问一下各位,怎么报名鸿蒙os2.0
  10. 关于二级域名Cookie的问题及解决方法
  11. 队列与栈(Queue,Deque,Stack)
  12. Gradle下载失败的解决办法
  13. 74HC138 三八译码器
  14. 2021充电必备:推荐一些免费的电子书网站及TXT阅读器
  15. 如何提高学生线上学习率的有效方法——以高一数学基础模块复习教学为例
  16. AndroidQQ登录
  17. 机器学习实战(1)——概览
  18. java自行车内走线,科普向 公路车有几种全内走线方式?
  19. 关于内存条低压标压以及不同品牌容量内存条组建双通道笔记
  20. android 中动态加载广告sdk

热门文章

  1. apache启服务命令_linux系统下apache服务的启动、停止、重启命令
  2. Adobe Edge Animate 1.0-软件内部教程
  3. Spring Cloud 子项目介绍
  4. centos安装桌面和远程连接
  5. Android学习--广播机制
  6. vue路由异步组件案例
  7. 在C#中用RX库和await来实现直观的状态机
  8. 读书笔记Black-Scholes-Merton之二
  9. 1-算法 排序 选择排序
  10. C++类型转换实现不同类型相加【复数与double类型相加】