你好,我遇到了一个问题。我正在尝试为Mnist数据集创建GUI,并且我需要一个28x28像素的窗口,但是在屏幕空间中大约是420x420。这意味着每个像素应出现其原始大小的15倍。我还需要绘制到屏幕上。到目前为止,我还没有发现任何有效的方法。
先谢谢了。 (如果您需要澄清,请发表评论)
Pygame 1.9.6版
Python版本3.6.7
答案 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()