如何通过不在每个像素上绘制矩形来使我的代码更加优化?
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)
我正在使用 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)