Pygame详解(六):image 模块

pygame.image

用于图像传输的 Pygame 模块。

函数

  • pygame.image.load()  —  从文件加载新图片
  • pygame.image.save()  —  将图像保存到磁盘上
  • pygame.image.get_extended()  —  检测是否支持载入扩展的图像格式
  • pygame.image.tostring()  —  将图像转换为字符串描述
  • pygame.image.fromstring()  —  将字符串描述转换为图像
  • pygame.image.frombuffer()  —  创建一个与字符串描述共享数据的 Surface 对象

image 模块包含了加载和保存图像的函数,同时转换为 Surface 对象支持的格式。

注意:没有 Image 类;当一个图像被成功载入后,将转换为 Surface  对象。Surface  对象允许你在上边画线、设置像素、捕获区域等。

Image 是 Pygame 相当依赖的一个模块,支持载入的图像格式如下:

  • JPG
  • PNG
  • GIF(无动画)
  • BMP
  • PCX
  • TGA(无压缩)
  • TIF
  • LBM(和 PBM)
  • PBM(和 PGM,PPM)
  • XPM

支持保存为以下格式:

  • BMP
  • TGA
  • PNG
  • JPEG

其中,保存为 PNG 和 JPEG 格式是 Pygame 1.8 新增加的。

函数详解

pygame.image.load()

从文件加载新图片。

load(filename) -> Surface

load(fileobj, namehint=””) -> Surface

从文件加载一张图片,你可以传递一个文件路径或一个 Python 的文件对象。

Pygame 将自动判断图像的格式(比如 GIF 或位图)并创建一个新的 Surface  对象。有时它可能需要知道文件的后缀名(比如 GIF 图像应该以 ".gif" 为后缀)。如果你传入原始文件对象,你需要传入它对应的文件名到 namehint 参数中。

返回的 Surface  对象将包含与源文件相同的颜色格式,colorkey 和 alpha 透明度通道。你通常需要调用 Surface.convert() 函数进行转换,这样可以使得在屏幕上绘制的速度更快。

对于含有 alpha 通道的图片(支持部分位置透明,像 PNG 图像),需要使用 Surface.convert_alpha() 函数进行转换。

在某些环境下,Pygame 可能无法支持上述所有的图像格式,但至少无压缩的 BMP 格式是支持的。你可以调用 pygame.image.get_extended() 函数,如果返回 True,说明可以加载上述的格式(包含 PNG,JPG 和 GIF)。

你应该使用 os.path.join() 提高代码的兼容性:

asurf = pygame.image.load(os.path.join('data', 'Python.png'))

pygame.image.save()

将图像保存到磁盘上。

save(Surface, filename) -> None

该函数将保存 Surface  对象到磁盘上,支持存储为 BMP,TGA,PNG 或 JPEG 格式的图像。如果 filename 没有指定后缀名,那么默认是保存为 TGA 格式。TGA 和 BMP 格式是无压缩的文件。

保存为 PNG 和 JPEG 格式是 Pygame 1.8 新增的。

pygame.image.get_extended()

检测是否支持载入扩展的图像格式。

get_extended() -> bool

如果 Pygame 支持上述所有的扩展图像格式,则返回 True。

pygame.image.tostring()

将图像转换为字符串描述。

tostring(Surface, format, flipped=False) -> string

将图像转换为一个字符串描述,可以被 Python 的其他图像模块通过 "fromstring" 转换回图像。一些 Python 图像模块喜欢“自下而上”的存储格式(例如 PyOpenGL)。如果 flipped 参数为 True,那么字符串将会垂直翻转以适用这类图像模块。

format 参数可以是下表中任何一个字符串。注意:只有 8 位的 Surface  对象可以使用 "P" 格式。其他格式可以用于任何 Surface  对象上。

字符串

含义

P8 位调色板的 Surface  对象
RGB24 位图像
RGBX32 位图像,不留空白
RGBA32 位图像,带 alpha 通道
ARGB32 位图像,带 alpha 通道,并将 alpha 放在前边
RGBA_PREMULT32 位图像,通过 alpha 通道缩放
ARGB_PREMULT32 位图像,通过 alpha 通道缩放,并将 alpha 放在前边

pygame.image.fromstring()

将字符串描述转换为图像。

fromstring(string, size, format, flipped=False) -> Surface

该函数的使用跟 pygame.image.tostring() 相似。size 参数是一对表示宽度和高度的数字。一旦新的 Surface 对象创建成功,你就可以删除字符串描述。

size 和 format 参数指定的数据需要跟字符串描述相符,否则将抛出异常。

更快地将图片转换到 Pygame,请参考 pygame.image.frombuffer() 函数。

pygame.image.frombuffer()

创建一个与字符串描述共享数据的 Surface 对象。

frombuffer(string, size, format) -> Surface

创建一个新的 Surface 对象,与字符串描述直接共享像素数据。该函数的使用跟 pygame.image.fromstring() 类似,但没法垂直翻转原始数据。

该函数的速度会比 pygame.image.fromstring() 快很多,因为该函数不需要申请和拷贝任何像素数据。

要删除pygame中的图片碰撞,可以使用以下步骤: 1. 创建一个列表,用于存储所有需要显示的图片。 2. 在游戏循环中,遍历这个列表,绘制每个图片。 3. 使用pygame.sprite.spritecollide()函数检测碰撞,并返回一个碰撞的列表。 4. 遍历碰撞列表,删除其中的图片。 5. 在游戏循环中,更新屏幕并重绘所有还存在的图片。 具体实现代码示例: ``` import pygame # 初始化pygame pygame.init() # 创建窗口 screen = pygame.display.set_mode((400, 400)) # 加载图片 image1 = pygame.image.load('image1.png') image2 = pygame.image.load('image2.png') # 创建一个精灵组 sprites = pygame.sprite.Group() # 将图片添加到精灵组中 sprite1 = pygame.sprite.Sprite() sprite1.image = image1 sprite1.rect = image1.get_rect() sprite1.rect.x = 100 sprite1.rect.y = 100 sprites.add(sprite1) sprite2 = pygame.sprite.Sprite() sprite2.image = image2 sprite2.rect = image2.get_rect() sprite2.rect.x = 200 sprite2.rect.y = 200 sprites.add(sprite2) # 游戏循环 while True: # 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() # 绘制所有精灵 sprites.draw(screen) # 检测碰撞 collisions = pygame.sprite.spritecollide(sprite1, sprites, True) # 删除碰撞的图片 for collision in collisions: sprites.remove(collision) # 更新屏幕 pygame.display.update() ``` 在上面的代码中,我们创建了一个精灵组sprites,并将两张图片添加到精灵组中。然后,在游戏循环中,我们使用pygame.sprite.spritecollide()函数检测碰撞,并将返回的碰撞列表遍历,删除其中的图片。最后,我们更新屏幕并绘制所有还存在的图片。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值