在pygame中仅加载图像的一部分?

Posted

技术标签:

【中文标题】在pygame中仅加载图像的一部分?【英文标题】:Load only part of an image in pygame? 【发布时间】:2016-07-22 21:13:36 【问题描述】:

我可以加载整个图像并使用它们轻松处理

pygame.image.load("image.png")  

但如果我只想要一小部分,我必须加载整个图像并从那里裁剪。 pygame 中有没有一种方法可以有效地仅加载图像的一部分?

【问题讨论】:

【参考方案1】:

加载你的图片

my_image = pygame.image.load("image.png")

创建一个新的表面

surf = pygame.Surface((X, Y))

X 和 Y 分别是以 px 为单位的水平和垂直尺寸。

将图像放在表面上

surf.blit( my_image, (A, B), (C, D, E, F) )

A 和 B 是到左上角的距离。这会将图像放置在表面 A px 向下和 B px 左侧。

C 和 D 是从左上角裁剪的图像部分。 C px 向下,D px 向左。

E 和 F 定义图像大小。

【讨论】:

这不会加载图像的一部分,它会加载整个图像并将其裁剪 这正是任何程序都会做的事情。您不能只读取图像的一部分。您阅读整个图像,然后修剪掉您不想要的部分。图像的格式不是您只能从 (A, B) 加载到 (X, Y) 的像素。由于压缩,如果没有所有其他像素的上下文,软件无法知道这些像素在文件中的位置。像 BMP 这样的未压缩格式可能允许这样做,但 OP 询问了 PNG。 大多数图像格式(包括PNG)可以逐行读取,这意味着您可以解码并丢弃裁剪区域之前的所有行,逐行读取并仅将相关部分保存在内存中.然后关闭文件,无需解码其余行。这不会节省一些解码和大量 RAM。 (你只需要在内存中只保留一行)。其他格式允许随机访问某些部分(线或图块)。 github.com/lilohuang/PyTurboJPEG 有一个裁剪功能可以做到这一点。我找不到支持 PNG 操作的 python 库。【参考方案2】:

我推荐使用 DaFluffyPotato 的代码

def clip(surface, x, y, x_size, y_size): #Get a part of the image
    handle_surface = surface.copy() #Sprite that will get process later
    clipRect = pygame.Rect(x,y,x_size,y_size) #Part of the image
    handle_surface.set_clip(clipRect) #Clip or you can call cropped
    image = surface.subsurface(handle_surface.get_clip()) #Get subsurface
    return image.copy() #Return

他的频道 https://www.youtube.com/c/DaFluffyPotato

【讨论】:

以上是关于在pygame中仅加载图像的一部分?的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 多部分/表单数据上传请求中仅不发送图像

在 UITableView 中仅重新加载一个节标题

pygame.transform.chop 不工作

如何在 Django DateField 中仅保留日期部分

如何将 pygame Surface 转换为 PIL 图像?

我如何通过文本文件在Pygame中加载图像