2015-01-20 27 views
0

我使用PyGame的图形库在LED显示屏上显示图形。在PyGame中将小表面映射到较大表面上

我的LED显示屏是25x7。对于没有硬件测试,我已经能够使用pygame的的display查看40倍放大版本:

screen = pygame.display.set_mode((1000,280)) 

我想实际绘制一个25x7网格盒子,rects等,然后投影到一个我的电脑上有一个更大的1000x280窗口,看起来像是一个40x40“像素”的25x7网格。这样,如果我开始使用硬件,我可以跳过大型投影,只需将25x7 = 175像素的数据写入我的LED。

我想出了一个解决方案,但它过于缓慢:

xDim = 25 
yDim = 7 

pixelMultiplier = 40 
surf = pygame.Surface((xDim,yDim)) 
bigSurf = pygame.Surface((pixelMultiplier*xDim,pixelMultiplier*yDim)) 

# ... manipulate surf ... 

# map surf to bigSurf 
    for x in range(xDim): 
    for y in range(yDim): 
     # grab color of pixel 
     tmpColor = surf.get_at((x,y)) 

     # write to all pixels in larger surface 
     for i in range(pixelMultiplier): 
     for j in range(pixelMultiplier): 
      bigSurf.set_at((pixelMultiplier*x+i,pixelMultiplier*y+j),tmpColor) 

有一些内置的功能pygame的做这个工作效率?

回答

0

权写的帖子后,这个我恍然大悟:

创建一个面来表示像素,只是blit是在较大的表面。而不是通过所有175个像素的1600 set_at()函数运行,使用内置函数已经做到了。

# map surf to larger version 
    for x in range(xDim): 
    for y in range(yDim): 
     # grab color of pixel 
     tmpColor = surf.get_at((x,y)) 

     # create square surface to represent pixel 
     pixelSurf = pygame.Surface((pixelMultiplier,pixelMultiplier)) 
     pixelSurf.fill(tmpColor) 

     # blit big pixel onto bigSurf 
     bigSurf.blit(pixelSurf,(pixelMultiplier*x,pixelMultiplier*y)) 

这将运行快,但我仍然不知道它的最佳解决方案。

编辑 - 最佳方法

pygame的确实有一个内置的功能!

pygame.transform.scale(surface,(newX,newY))