Pygame将28x28像素缩放到420x420

时间:2019-05-14 18:25:47

标签: python python-3.x pygame pixel

你好,我遇到了一个问题。我正在尝试为Mnist数据集创建GUI,并且我需要一个28x28像素的窗口,但是在屏幕空间中大约是420x420。这意味着每个像素应出现其原始大小的15倍。我还需要绘制到屏幕上。到目前为止,我还没有发现任何有效的方法。

先谢谢了。 (如果您需要澄清,请发表评论)

Pygame 1.9.6版

Python版本3.6.7

1 个答案:

答案 0 :(得分:2)

一个简单的答案是简单地使用pygame.transform.smoothscale()缩放位图,然后blit()缩放到屏幕。但是,这种缩放在计算上是昂贵的。

定义一个“像素”精灵非常容易,它可以根据屏幕的子尺寸进行缩放和定位。当像素设置为(x,y)时,它会简单地转换为屏幕上的缩放位置。

我对屏幕尺寸和像素数进行了参数设置,以轻松地将像素缩放到所需的任何尺寸。

该代码使用坐标列表在屏幕上绘制一堆像素精灵。

import pygame
import sys

# Window size
WINDOW_WIDTH  = 420
WINDOW_HEIGHT = 420
FPS           = 60
PIXELS_WIDTH  = 28  # How many big-pixels vertically
PIXELS_HEIGHT = 28  # How many big-pixels horizontally
# background & colours
INKY_BLACK    = ( 28,  28,  58)
EGG_YELLOW    = (255, 233, 132)

class PixelSprite( pygame.sprite.Sprite ):
    def __init__( self, x, y, width=WINDOW_WIDTH//PIXELS_WIDTH, height=WINDOW_HEIGHT//PIXELS_HEIGHT ):
        pygame.sprite.Sprite.__init__( self )
        self.image  = pygame.Surface( ( width, height ), pygame.SRCALPHA )
        self.rect   = self.image.get_rect()
        self.rect.x = x * WINDOW_WIDTH  // PIXELS_WIDTH
        self.rect.y = y * WINDOW_HEIGHT // PIXELS_HEIGHT
        self.fill( INKY_BLACK )  # off

    def update( self ):
        pass

    def fill( self, colour ):
        self.image.fill( colour )



### MAIN
pygame.init()
pygame.font.init()
SURFACE = pygame.HWSURFACE|pygame.DOUBLEBUF|pygame.RESIZABLE
WINDOW  = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ), SURFACE )
pygame.display.set_caption("Big-Pixel Sprite Test")


pixels = pygame.sprite.Group() 
for coords in [ ( 8,10 ), ( 18, 10 ), (6,15), (7,16), (8,17), (9,17), (10,17), (11,18), (12,18), (13,18), (14,18), (15,18), (16,17), (17,17), (18,17), (19,16), (20,15) ] :
    x,y = coords
    pixel = PixelSprite( x, y )
    pixel.fill( EGG_YELLOW )
    pixels.add( pixel )

clock = pygame.time.Clock()
done  = False
while not done:

    # Handle user-input
    for event in pygame.event.get():
        if ( event.type == pygame.QUIT ):
            done = True
        elif ( event.type == pygame.KEYDOWN ):
            if ( event.unicode == 'q' or event.scancode == pygame.K_q ):
                done = True

    # Repaint the screen
    pixels.update()
    WINDOW.fill( INKY_BLACK )
    pixels.draw( WINDOW )

    pygame.display.flip()
    # Update the window, but not more than 60fps
    clock.tick_busy_loop( FPS )

pygame.quit()

pixel-sprite-output.png