使用pygame绘制图像的好方法是啥?

Posted

技术标签:

【中文标题】使用pygame绘制图像的好方法是啥?【英文标题】:What is a good way to draw images using pygame?使用pygame绘制图像的好方法是什么? 【发布时间】:2012-02-10 23:50:25 【问题描述】:

我想知道如何使用 pygame 绘制图像。我知道如何加载它们。 我做了一个空白窗口。 当我使用screen.blit(blank, (10,10)) 时,它不会绘制图像,而是将屏幕留空。

【问题讨论】:

你用谷歌搜索了draw images pygame 吗?在我的电脑中,我得到了一些有用的文档和教程 我们说的是 .png 类型的图片吗? 【参考方案1】:

这是一个典型的布局:

myimage = pygame.image.load("myimage.bmp")
imagerect = myimage.get_rect()

while 1:
    your_code_here

    screen.fill(black)
    screen.blit(myimage, imagerect)
    pygame.display.flip()

【讨论】:

【参考方案2】:
import pygame, sys, os
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((100, 100))

player = pygame.image.load(os.path.join("player.png"))
player.convert()

while True:
    screen.blit(player, (10, 10))
    pygame.display.flip()

pygame.quit()

加载文件player.png。 运行它,它可以完美运行。所以希望你能学到一些东西。

【讨论】:

pygame.quit() 永远不会被执行,true 应该是 True convert() 返回新图像;它不会就地更改图像。所以player.convert() 什么都不做。【参考方案3】:

在您的绘图表面上使用blit 或任何其他更新后,您必须调用pygame.display.flip() 来实际更新显示的内容。

【讨论】:

【参考方案4】:

图像由"pygame.Surface" 对象表示。 Surface 可以从带有pygame.image.load 的图像创建:

my_image_surface = pygame.load.image('my_image.jpg')

但是,pygame 文档指出:

返回的 Surface 将包含与其来源文件相同的颜色格式、颜色键和 alpha 透明度。您经常需要不带参数地调用convert(),以创建一个可以更快地在屏幕上绘制的副本。 对于 alpha 透明度,就像在 .png 图像中一样,在加载后使用convert_alpha() 方法,以便图像具有每个像素的透明度。

使用适当的转换方法以获得最佳性能:

image_surface = pygame.load.image('my_image.jpg').convert()
alpha_image_surface = pygame.load.image('my_icon.png').convert_alpha()

Surface 可以使用blit 方法在另一个Surface 上绘制或混合。 blit 的第一个参数是应该绘制的 Surface。第二个参数是表示左上角的元组 (x, y) 或矩形。对于矩形,只考虑矩形的左上角。需要说明的是,窗口分别显示也是由一个Surface来表示的。因此,在窗口中绘制Surface与在Surface上绘制Surface是一样的:

window_surface.blit(image_surface, (x, y))
window_surface.blit(image_surface,
    image_surface.get_rect(center = window_surface.get_rect().center))

小例子:

import pygame

pygame.init()
window = pygame.display.set_mode((300, 300))
clock = pygame.time.Clock()

pygameSurface = pygame.image.load('apple.png').convert_alpha()

run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    window.fill((127, 127, 127))
    window.blit(pygameSurface, pygameSurface.get_rect(center = window.get_rect().center))
    pygame.display.flip()

pygame.quit()
exit()

pygame.image.load 可以加载大多数图像。根据文档,支持以下格式:JPG、PNG、GIF(非动画)、BMP、PCX、TGA(未压缩)、TIF、LBM(和 PBM)、PBM(和 PGM、PPM)、XPM。

如果您想在 PyGame 中使用与其他库一起加载的图像,请参阅:

PIL and pygame.image How do I convert an OpenCV (cv2) image (BGR and BGRA) to a pygame.Surface object

有关加载可缩放矢量图形 (SVG) 文件的信息,请参阅:

SVG rendering in a PyGame application

加载动画 GIF 文件显示在:

How can I load an animated GIF and get all of the individual frames in PyGame? How do I make a sprite as a gif in pygame?

或查看如何加载NumPy 帧:

Pygame and Numpy Animations

【讨论】:

以上是关于使用pygame绘制图像的好方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在pygame中围绕精灵或图像绘制边框?

有没有一种不用图像就可以用 HTML5 画布和 javascript 动态绘制云的好方法?

pyagme 图像/图形绘制

python 在pygame中绘制TMX图块并将其保存为图像

基础DAY14-飞机大战-绘制图像

pygame 绘制带有剪切区域的 lifebar