Pygame(十四)图像变换
Pygame(十四)图像变换
前情提要
本节提要
前言
上一节我们学习了如何从文件加载图像到pygame中以便我们将游戏做的更加精致,更加受人喜欢.
但是有些时候,我们可能需要对文件加载进来的图片进行一些处理,以达到更好的效果.
比如,我们在制作人物运动的时候,朝左走的人和朝右走的人是左右镜像的.如果我们还是用两个文件的图片的话,就会造成资源的浪费.
不仅浪费有限的存储空间,还浪费人力,物力去准备这双重的资源.如果我们能够实现这样的镜象效果,就可以达成以上的节省目标.
内容详情
翻转
翻转分左右翻转与上下翻转
两两组合可以实现以下几种:
- 不翻转
- 左右翻转
- 上下翻转
- 上下左右都翻转
new_img = pygame.transform.flip(old_img, xbool, ybool)
参数说明:
- old_img:待翻转的surfcae对象
- xbool:是否左右(水平)翻转, True:翻转, False:不翻转
- ybool:是否上下(垂直)翻转,True:翻转, False:不翻转
–>产生一个新的surface对象
示例:
- 不翻转
def flip():'''翻转'''pygame.init()screen = pygame.display.set_mode((800, 600))pygame.display.set_caption("图像变换")img = pygame.image.load("img.jpg").convert() # 原图none_flip_img = pygame.transform.flip(img, False, False) # 不翻转的图width = img.get_width() # 获取img的宽 height = img.get_height() # 获取img的高screen.blit(img, (0, 0)) # 绘制原图screen.blit(none_flip_img, (width, 0)) # 绘制新图pygame.display.update()while 1:for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()
- 左右翻转
def flip():'''翻转'''pygame.init()screen = pygame.display.set_mode((800, 600))pygame.display.set_caption("图像变换")img = pygame.image.load("img.jpg").convert() # 原图none_flip_img = pygame.transform.flip(img, False, False) # 不翻转的图x_flip_img = pygame.transform.flip(img, True, False) # 左右翻width = img.get_width() # 获取img的宽度screen.blit(img, (0, 0))screen.blit(none_flip_img, (width, 0))screen.blit(x_flip_img, (width * 2, 0))pygame.display.update()while 1:for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()
效果图:
- 上下翻转
def flip():'''翻转'''pygame.init()screen = pygame.display.set_mode((800, 600))pygame.display.set_caption("图像变换")img = pygame.image.load("img.jpg").convert() # 原图# none_flip_img = pygame.transform.flip(img, False, False) # 不翻转的图x_flip_img = pygame.transform.flip(img, True, False) # 左右翻y_flip_img = pygame.transform.flip(img, False, True) # 左右翻width = img.get_width() # 获取img的宽度screen.blit(img, (0, 0))screen.blit(x_flip_img, (width, 0))screen.blit(y_flip_img, (width * 2, 0))pygame.display.update()while 1:for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()
效果图:
- 左右上下翻转
def flip():'''翻转'''pygame.init()screen = pygame.display.set_mode((800, 600))pygame.display.set_caption("图像变换")img = pygame.image.load("img.jpg").convert() # 原图# none_flip_img = pygame.transform.flip(img, False, False)# x_flip_img = pygame.transform.flip(img, True, False) # 左右翻# y_flip_img = pygame.transform.flip(img, False, True) # 左右翻both_flip_img = pygame.transform.flip(img, True, True) # 左右翻width = img.get_width() # 获取img的宽度screen.blit(img, (0, 0))# screen.blit(x_flip_img, (width, 0))# screen.blit(y_flip_img, (width * 2, 0))screen.blit(both_flip_img, (width, 0))pygame.display.update()while 1:for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()
效果图:
旋转
new_img = pygame.transform.rotate(old_img, angle)
参数说明:
- old_image: 待旋转的surface对象
- angle: 旋转角度,单位:度, 正的时候 是逆时针方向旋转, 负的时候顺时针方向旋转
–>返回一个新的surface对象
示例:
def rotate():'''旋转'''pygame.init()screen = pygame.display.set_mode((800, 600))pygame.display.set_caption("图像变换")img = pygame.image.load("img.jpg").convert() # 原图new_img1 = pygame.transform.rotate(img, 90) # 逆时针90度new_img2 = pygame.transform.rotate(img, -90) # 顺时针90度width = img.get_width() # 获取img的宽度screen.blit(img, (0, 0))screen.blit(new_img1, (width, 0))screen.blit(new_img2, (width, width))pygame.display.update()while 1:for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()
效果图:
放缩
new_img = pygame.transform.scale(old_img, (width, height), DestSurface=None)
参数说明:
- old_img:待放缩的surface对象
- (width, height): 放缩后的宽和高组成的二元tuple
- DestSurface: 默认None,当指定了一个surface对象时,将返回的内容直接放到DestSurface中指定的值(不建义如此使用),虽然这样会加快程序速度
在没有desSurface时返回一个surface对象,如果有destSurface,会将放缩后的内容直接放在DestSurface指定的surface对象上
示例
def scale():'''放缩'''pygame.init()screen = pygame.display.set_mode((800, 600))pygame.display.set_caption("图像变换")img = pygame.image.load("img.jpg").convert() # 原图width = img.get_width() # 获取img的宽度height = img.get_height() # 获取img的高度new_img = pygame.transform.scale(img,(width // 2, height // 2)) # 缩小到一半的大小screen.blit(img, (0, 0))screen.blit(new_img, (width, 0))pygame.display.update()while 1:for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()
效果图:
特别的:
- 如果想放大2倍,可以直接写成:
new_img= pygame.transform.scale2x(old_img)
- 如果放大的位数比较大的时候为了避免图像出现的锯齿太过明显.可以用平滑模式
new_img = pygame.transform.smoothscale(old_img, (width, height), DestSurface = None)
看一下普通两倍与平滑两倍的效果
旋转时放缩
new_img = pygame.transform.rotozoom(old_img, angle, scale)
参数说明:
- old_img:待变换的surface对象
- angle: 旋转角度,单位: 度, 正值逆时针 ,负值顺时针
- scale: 放缩倍数(正浮点数)
–>返回一个变换后的surface对象
示例:
def rotate_scale():'''旋转同时放缩'''pygame.init()screen = pygame.display.set_mode((1000, 800))pygame.display.set_caption("图像变换")img = pygame.image.load("img.jpg").convert() # 原图new_img = pygame.transform.rotozoom(img, 60, 0.5) # 逆时针转60度,缩小到原来的一半screen.blit(new_img, (0, 0))pygame.display.update()while 1:for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()
效果图:
裁剪
有时候我们只需要目标图片的一部分,我们就要用到裁剪了
new_img = pygame.transform.chop(old_img, rect)
参数说明:
- old_img:待变换的surface对象
- rect 相对待变换的surface对象的矩形区域
注意,这个函数用到的rect不是说从图像中将我们要的那个部分的图像框进来
实际情况是这样的:
rect = (left, top , widht, height)
黑色大矩形表示原图
红色十字部分是裁剪掉的部分
剩下的1,2,3,4四个部分的图往里面挤到一起,才是我们能裁剪到的图形
示例
def chop():'''裁剪'''pygame.init()screen = pygame.display.set_mode((1000, 800))pygame.display.set_caption("图像变换")img = pygame.image.load("img.jpg").convert() # 原图width = img.get_width()//2height = img.get_height()//2left = widthtop = heightnew_img = pygame.transform.chop(img, (100,121, 111, 222))screen.blit(img, (0, 0))screen.blit(new_img, (260, 0))pygame.display.update()while 1:for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()
效果图
后记
图像处理是一个比较有用的能力.与前面的知识可以形成很比较有意思的作品.
下节课,不见不散
Pygame(十四)图像变换相关推荐
- 学习 Python 之 Pygame 开发魂斗罗(十四)
学习 Python 之 Pygame 开发魂斗罗(十四) 继续编写魂斗罗 1. 创建桥类 2. 在主类中加入一些类变量 3. 显示桥 4. 解决玩家与桥的碰撞体问题 5. 解决敌人与桥的碰撞体问题 继 ...
- 视觉SLAM十四讲学习笔记-第七讲-视觉里程计-特征点法和特征提取和匹配实践
专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...
- PyGmae:有限状态机实践(十四)
# _*_ coding:utf-8 _*_ from random import randint import sys import pygame from pygame.locals import ...
- slam十四讲第二版 pdf_聊聊这两年学习slam啃过的书
作者:Amber 来源:微信公众号|3D视觉工坊(系投稿) 「3D视觉工坊」技术交流群已经成立,目前大约有8000人,方向主要涉及3D视觉.CV&深度学习.SLAM.三维重建.点云后处理.自动 ...
- pygame(十五)拼图游戏
pygame(十五)拼图游戏 前情提要 本节提要 内容详情 截取目标矩形图片 上节课,我们学到一个裁剪图片的方法: chop() 这个方法是将原截掉一个十字形的位置,将剩下的四个矩形合并成一个新的矩形 ...
- 万字长文告诉新手如何学习Python图像处理(上篇完结 四十四) | 「Python」有奖征文
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...
- SLAM面试笔记(1) -《视觉SLAM十四讲》
目录 第2讲:初识SLAM 问题1: 简述经典的SLAM框架 问题2: 视觉里程计的作用和存在的问题 问题3: 后端优化的作用 问题4: 回环检测的作用 第3讲:三维空间刚体运动 问题5:描述四元数的 ...
- Pygame(十九)音乐播放器1
Pygame(十九)音乐播放器1 前情提要 本节提要 界成设计 效果图 界面代码设计 # /usr/bin/python3# Author: 爱编程的章老师 # @Time: 2021/1/17 00 ...
- [Python从零到壹] 六十四.图像识别及经典案例篇之图像傅里叶变换和傅里叶逆变换详解
祝大家新年快乐,阖家幸福,健康快乐! 欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所 ...
最新文章
- linux系统怎么建ftp服务器地址,Ubuntu Linux系统建立FTP服务器方法步骤
- 女友的前男友教我该怎么照顾她......
- 如何禁用win7的ASLR
- Java SSM篇2——框架的基本认识
- java数组更新_java刷新数组到jList
- wordpress向一个页面POST数据,出现404页面访问不了
- Mate7微信指纹支付来了 比Touch ID整合微信早一点
- 自然语言处理(NLP)语义分析:“词汇级”语义分析【词义消歧、词义表示和学习】、“句子级”语义分析【浅层语义分析(语义角色标注)、深层语义分析】
- 银行软件测试项目管理中存在的问题及解决的对策
- 神经网络模型学习笔记(ANN,BPNN)
- 计算机局域网访问密码设置,win10系统设置局域网访问需要密码的详细办法
- WEB 安全之 SQL注入 二 暴库
- 小游戏吃饭,睡觉,打豆豆,亲
- 计算机一级excel试题百度云,excel计算机一级试题.doc
- 微信小程序开发之获取用户信息
- matlab抽样仿真混叠图,数字信号处理及MATLAB仿真__前言
- 如何判断生成的交易策略(EA)是好是坏?
- java判断数据库连接是否有效的方法
- 巴旦木树苗种植经历了几个周期?
- gd32f303 设计中断优先级_ALIENTEK 阿波罗 STM32F767 开发板资料连载第九章 外部中断实验...