我正在寻找允许我在显示屏上绘制单个像素的方法。例如,当我单击鼠标时,我希望单击像素的位置改变颜色。我知道如何读取鼠标位置,但我找不到简单的像素绘制(有 screen.fill 方法,但它没有按我的意愿工作)。
5 回答
你可以这样做surface.set_at()
:
surface.set_at((x, y), color)
您还可以使用pygame.gfxdraw.pixel()
:
from pygame import gfxdraw
gfxdraw.pixel(surface, x, y, color)
但是,请注意警告:
EXPERIMENTAL!:意味着这个 api 可能会改变,或者在以后的 pygame 版本中消失。如果你使用它,你的代码将在下一个 pygame 版本中中断。
你也可以surface.fill()
用来做这项工作:
def pixel(surface, color, pos):
surface.fill(color, (pos, (1, 1)))
您也可以简单地画一条起点和终点相同的线:
def pixel(surface, color, pos):
pygame.draw.line(surface, color, pos, pos)
在Surface或显示器上绘制点的常用方法是使用 [`pygame.Surface.set_at']:
window_surface.set_at((x, y), my_color)
但是,此功能非常缓慢,如果要绘制超过 1 个点,则会导致性能严重不足。
单独设置每个像素的最小示例: repl.it/@Rabbid76/PyGame-DrawPixel-1
import pygame
pygame.init()
window = pygame.display.set_mode((300, 300))
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
window.fill(0)
rect = pygame.Rect(window.get_rect().center, (0, 0)).inflate(*([min(window.get_size())//2]*2))
for x in range(rect.width):
u = x / (rect.width - 1)
color = (round(u*255), 0, round((1-u)*255))
for y in range(rect.height):
window.set_at((rect.left + x, rect.top + y), color)
pygame.display.flip()
pygame.quit()
exit()
另一种选择是使用“pygame.PixelArray”对象。此对象支持对Surface对象的直接像素访问。可以直接分配一个PixelArray像素项。可以通过订阅访问像素。PixelArray 锁定Surface,您必须在close()
更改像素时使用它:
pixel_array = pygame.PixelArray(window_surface)
pixel_array[x, y] = my_color
pixel_array[start_x:end_x, start_y:end_y] = my_color
pixel_array.close()
一次设置一行像素的最小示例: repl.it/@Rabbid76/PyGame-DrawPixel-2
import pygame
pygame.init()
window = pygame.display.set_mode((300, 300))
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
window.fill(0)
rect = pygame.Rect(window.get_rect().center, (0, 0)).inflate(*([min(window.get_size())//2]*2))
pixel_array = pygame.PixelArray(window)
for x in range(rect.width):
u = x / (rect.width - 1)
color = (round(u*255), 0, round((1-u)*255))
pixel_array[rect.left + x, rect.top:rect.bottom] = color
pixel_array.close()
pygame.display.flip()
pygame.quit()
exit()
对于那些对问题的更现代答案感兴趣的人,您可以使用pygame.draw.circle()在给定位置(或中心)绘制单个像素。
pygame.draw.circle(surface, color, center, 0)
该文档特别指出:
radius (int or float) -- 圆的半径,从中心参数测量,半径为0只会绘制中心像素
这样做的一种方法是画一条在同一点凝视和结束的线。
pygame.draw.line(surface, (255,255,255), (x,y), (x,y))
绘制单个彩色像素
def drawPoint(x,y,color):
s = pygame.Surface((1,1)) # the object surface 1 x 1 pixel (a point!)
s.fill(color) # color as (r,g,b); e.g. (100,20,30)
# now get an object 'rectangle' from the object surface and place it at position x,y
r,r.x,r.y = s.get_rect(),x,y
screen.blit(s,r) # link the object rectangle to the object surface
当然你必须调用: pygame.display.update() 一旦你绘制了你需要的所有点,不要在每个点都调用更新。