Pygame(十四)图像变换

前情提要

本节提要

前言

上一节我们学习了如何从文件加载图像到pygame中以便我们将游戏做的更加精致,更加受人喜欢.
但是有些时候,我们可能需要对文件加载进来的图片进行一些处理,以达到更好的效果.
比如,我们在制作人物运动的时候,朝左走的人和朝右走的人是左右镜像的.如果我们还是用两个文件的图片的话,就会造成资源的浪费.
不仅浪费有限的存储空间,还浪费人力,物力去准备这双重的资源.如果我们能够实现这样的镜象效果,就可以达成以上的节省目标.

内容详情

翻转

翻转分左右翻转与上下翻转
两两组合可以实现以下几种:

  • 不翻转
  • 左右翻转
  • 上下翻转
  • 上下左右都翻转
new_img = pygame.transform.flip(old_img, xbool, ybool)

参数说明:

  • old_img:待翻转的surfcae对象
  • xbool:是否左右(水平)翻转, True:翻转, False:不翻转
  • ybool:是否上下(垂直)翻转,True:翻转, False:不翻转
    –>产生一个新的surface对象

示例:

  1. 不翻转
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()

  1. 左右翻转
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()

效果图:

  1. 上下翻转
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()

效果图:

  1. 左右上下翻转
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(十四)图像变换相关推荐

  1. 学习 Python 之 Pygame 开发魂斗罗(十四)

    学习 Python 之 Pygame 开发魂斗罗(十四) 继续编写魂斗罗 1. 创建桥类 2. 在主类中加入一些类变量 3. 显示桥 4. 解决玩家与桥的碰撞体问题 5. 解决敌人与桥的碰撞体问题 继 ...

  2. 视觉SLAM十四讲学习笔记-第七讲-视觉里程计-特征点法和特征提取和匹配实践

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...

  3. PyGmae:有限状态机实践(十四)

    # _*_ coding:utf-8 _*_ from random import randint import sys import pygame from pygame.locals import ...

  4. slam十四讲第二版 pdf_聊聊这两年学习slam啃过的书

    作者:Amber 来源:微信公众号|3D视觉工坊(系投稿) 「3D视觉工坊」技术交流群已经成立,目前大约有8000人,方向主要涉及3D视觉.CV&深度学习.SLAM.三维重建.点云后处理.自动 ...

  5. pygame(十五)拼图游戏

    pygame(十五)拼图游戏 前情提要 本节提要 内容详情 截取目标矩形图片 上节课,我们学到一个裁剪图片的方法: chop() 这个方法是将原截掉一个十字形的位置,将剩下的四个矩形合并成一个新的矩形 ...

  6. 万字长文告诉新手如何学习Python图像处理(上篇完结 四十四) | 「Python」有奖征文

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  7. SLAM面试笔记(1) -《视觉SLAM十四讲》

    目录 第2讲:初识SLAM 问题1: 简述经典的SLAM框架 问题2: 视觉里程计的作用和存在的问题 问题3: 后端优化的作用 问题4: 回环检测的作用 第3讲:三维空间刚体运动 问题5:描述四元数的 ...

  8. Pygame(十九)音乐播放器1

    Pygame(十九)音乐播放器1 前情提要 本节提要 界成设计 效果图 界面代码设计 # /usr/bin/python3# Author: 爱编程的章老师 # @Time: 2021/1/17 00 ...

  9. [Python从零到壹] 六十四.图像识别及经典案例篇之图像傅里叶变换和傅里叶逆变换详解

    祝大家新年快乐,阖家幸福,健康快乐! 欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所 ...

最新文章

  1. linux系统怎么建ftp服务器地址,Ubuntu Linux系统建立FTP服务器方法步骤
  2. 女友的前男友教我该怎么照顾她......
  3. 如何禁用win7的ASLR
  4. Java SSM篇2——框架的基本认识
  5. java数组更新_java刷新数组到jList
  6. wordpress向一个页面POST数据,出现404页面访问不了
  7. Mate7微信指纹支付来了 比Touch ID整合微信早一点
  8. 自然语言处理(NLP)语义分析:“词汇级”语义分析【词义消歧、词义表示和学习】、“句子级”语义分析【浅层语义分析(语义角色标注)、深层语义分析】
  9. 银行软件测试项目管理中存在的问题及解决的对策
  10. 神经网络模型学习笔记(ANN,BPNN)
  11. 计算机局域网访问密码设置,win10系统设置局域网访问需要密码的详细办法
  12. WEB 安全之 SQL注入 二 暴库
  13. 小游戏吃饭,睡觉,打豆豆,亲
  14. 计算机一级excel试题百度云,excel计算机一级试题.doc
  15. 微信小程序开发之获取用户信息
  16. matlab抽样仿真混叠图,数字信号处理及MATLAB仿真__前言
  17. 如何判断生成的交易策略(EA)是好是坏?
  18. java判断数据库连接是否有效的方法
  19. 巴旦木树苗种植经历了几个周期?
  20. gd32f303 设计中断优先级_ALIENTEK 阿波罗 STM32F767 开发板资料连载第九章 外部中断实验...

热门文章

  1. NSIS脚本文件格式
  2. visio2007小技巧
  3. Spring之IOC本质简述
  4. CF104C-Cthulhu
  5. 【图像重建】基于正交匹配追踪(OMP)算法结合小波变换是图像重建含Matlab源码
  6. 多屏幕切换到但屏幕,有软件无法在当前屏幕上无法显示
  7. 真的,Kafka 入门一篇文章就够了
  8. docker 下声卡无法连接
  9. 有多少域名被漏掉了?
  10. 遇见的Unity疑难杂症汇总(个人积累)