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

提前致谢。 (如果您需要澄清,请发表评论)

Pygame 1.9.6版

Python版本3.6.7

最佳答案

一个简单的答案是简单地用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()


python - Pygame将28x28像素缩放到420x420-LMLPHP

关于python - Pygame将28x28像素缩放到420x420,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56136432/

10-11 03:09
查看更多