pyGame图像比例无法按预期工作

时间:2016-03-01 11:38:37

标签: python image pygame transform scale

我是Python和pyGame的新手,我在缩放图像方面遇到了问题。 我想在pygame中缩放图像。 pygame文档声称

  

pygame.transform.scale()

应扩展到新的分辨率。 但在我下面的例子中它不起作用 - 它裁剪图像而不是调整大小!? 我究竟做错了什么?

#!/usr/bin/env python3
# coding: utf-8

import pygame
from pygame.locals import *

# Define some colors
BLACK = (0, 0, 0)

pygame.init()

# Set the width and height of the screen [width, height]
screen = pygame.display.set_mode((1920, 1080))

pic = pygame.image.load('test.jpg').convert()
pic_position_and_size = pic.get_rect()

# Loop until the user clicks the close button.
done = False

# Clear event queue
pygame.event.clear()

# -------- Main Program Loop -----------
while not done:
    for event in pygame.event.get():
        if event.type == QUIT:
            done = True
        elif event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                done = True

    # background in black
    screen.fill(BLACK)

    # Copy image to screen:
    screen.blit(pic, pic_position_and_size)

    # Update the screen with what we've drawn.
    pygame.display.flip()
    pygame.display.update()

    pygame.time.delay(10)    # stop the program for 1/100 second

    # decreases size by 1 pixel in x and y axis
    pic_position_and_size = pic_position_and_size.inflate(-1, -1)

    # scales the image
    pic = pygame.transform.scale(pic, pic_position_and_size.size)

# Close the window and quit.
pygame.quit()

1 个答案:

答案 0 :(得分:1)

pygame.transform.scale()对您的情况不起作用。如果缩小Surface这么小的量,算法只会裁剪最后一列和一行像素。如果您现在使用相同的Surface一遍又一遍地重复此过程,您会看到您看到的奇怪行为。

更好的方法是保留原始Surface的副本,并将其用于创建缩放图像。此外,使用smoothscale代替scale也可能会带来更好的效果;如果你想使用它,它取决于你。

这是"固定"您的代码版本:

#!/usr/bin/env python3
# coding: utf-8

import pygame
from pygame.locals import *

# Define some colors
BLACK = (0, 0, 0)

pygame.init()

# Set the width and height of the screen [width, height]
screen = pygame.display.set_mode((1920, 1080))

org_pic = pygame.image.load('test.jpg').convert()
pic_position_and_size = org_pic.get_rect()
pic = pygame.transform.scale(org_pic, pic_position_and_size.size)
# Loop until the user clicks the close button.
done = False

# Clear event queue
pygame.event.clear()

# -------- Main Program Loop -----------
while not done:
    for event in pygame.event.get():
        if event.type == QUIT:
            done = True
        elif event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                done = True

    # background in black
    screen.fill(BLACK)

    # Copy image to screen:
    screen.blit(pic, (0,0))

    # Update the screen with what we've drawn.
    pygame.display.flip()
    pygame.display.update()

    pygame.time.delay(10)    # stop the program for 1/100 second

    # decreases size by 1 pixel in x and y axis
    pic_position_and_size = pic_position_and_size.inflate(-1, -1)

    # scales the image
    pic = pygame.transform.smoothscale(org_pic, pic_position_and_size.size)

# Close the window and quit.
pygame.quit()