Pygame:绘制单个像素

时间:2012-04-27 16:41:53

标签: python pygame

我正在寻找允许我在显示屏上绘制单个像素的方法。例如,当我点击鼠标时,我想要点击像素的位置来改变颜色。我知道如何阅读鼠标pos,但我找不到简单的像素绘制(有screen.fill方法,但它没有按我的意愿工作)。

5 个答案:

答案 0 :(得分:31)

您可以使用surface.set_at()执行此操作:

surface.set_at((x, y), color)

您还可以使用pygame.gfxdraw.pixel()

from pygame import gfxdraw
gfxdraw.pixel(surface, x, y, color)

请注意警告:

  

实验!:意思是这个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)

答案 1 :(得分:1)

对于那些对这个问题的更现代答案感兴趣的人,您可以使用pygame.draw.circle()在给定位置(或中心)绘制单个像素。

pygame.draw.circle(surface, color, center, 0)

文档特别指出:

  

半径(整数或浮点数)-圆的半径,从center参数开始测量,半径为0只会绘制中心像素

答案 2 :(得分:1)

绘制一个彩色像素

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() 绘制所有需要的点,不要在每个点都调用update。

答案 3 :(得分:1)

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()

答案 4 :(得分:0)

一种方法是绘制一条凝视并在同一点结束的线。

pygame.draw.line(surface, (255,255,255), (x,y), (x,y))