在PyGame中将小表面映射到更大的表面

时间:2015-01-20 19:00:34

标签: python mapping pygame

我使用PyGame的图形库在LED显示屏上显示图形。

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

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

我想在25x7网格上实际绘制盒子,镜像等,然后将其投影到我的计算机上的一个更大的1000x280窗口上,这个窗口看起来像一个25x7网格的40x40"像素&#34 ;。这样,如果我开始使用硬件,我可以跳过大型投影,只需将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功能可以有效地完成这项工作?

1 个答案:

答案 0 :(得分: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))