如何通过不在每个像素上绘制矩形来使我的代码更加优化?

How can I make my code more optimised by not drawing a rect on each pixel?

我正在使用 cv2.imread() 函数在 pygame 中制作一个可以处理图像的关卡编辑器,唯一的问题是 cv2.imread() 给我提供了像素信息因此我只能显示每个 pixel.This 一个矩形,这使得代码非常慢并且无法使用它。我曾尝试将所有值存储在列表中,但问题出在 pygame rect 函数中,因为它无法显示所有具有碰撞的像素和所有像素。

代码:

import sys
import pygame
from pygame import *
import cv2

pygame.init()

screen = pygame.display.set_mode((388, 404))

lib = ['Map1.png']

Read = list(cv2.imread(lib[0]))

clock = pygame.time.Clock()
while True:
    screen.fill((15, 15, 15))

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
            
    for i in range(len(Read)):#y coords
        for j in range(len(Read[i])):#x coords
            blue = list(Read[i][j])[0]
            green = list(Read[i][j])[0]
            red = list(Read[i][j])[0]
            if blue > 240 and green > 240 and red > 240:
                pygame.draw.rect(screen, (255,255,255), pygame.Rect(j, i, 32,32))
            else:
                pygame.draw.rect(screen, (0), pygame.Rect(j, i, 32, 32))
        
    pygame.display.update()
    clock.tick(120)

地图 1:

我推荐使用pygame.image.load and a pygame.mask.Mask:

  • 从表面创建遮罩 (pygame.mask.from_surface)
  • 反转掩码 (invert())
  • 从蒙版 (to_surface())
  • 创建黑白 Surfcae
  • 放大黑白表面 (pygame.transform.scale)
import sys
import pygame
from pygame import *

pygame.init()

screen = pygame.display.set_mode((388, 404))


read_surf = pygame.image.load("Map1.png")
w, h = read_surf.get_size()
mask = pygame.mask.from_surface(read_surf)
# mask.invert() # optional
mask_surf = pygame.transform.scale(mask.to_surface(), (w*32, h*32))

clock = pygame.time.Clock()
while True:
    screen.fill((15, 15, 15))

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
            
    screen.blit(mask_surf, (0, 0))
        
    pygame.display.update()
    clock.tick(120)