20

ディスプレイ画面に1ピクセルを描画できる方法を探しています。たとえば、マウスをクリックしたときに、クリックしたピクセルの位置の色を変更したい。マウス位置の読み方は知っていますが、単純なピクセル描画が見つかりませんでした(screen.fillメソッドがありますが、希望どおりに機能していません)。

4

5 に答える 5

45

あなたはこれを行うことができます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)
于 2012-04-27T16:43:29.627 に答える
8

サーフェスまたはディスプレイ上にポイントを描画する通常の方法は、[`pygame.Surface.set_at'] を使用することです。

window_surface.set_at((x, y), my_color)

ただし、この関数は非常に遅く、複数のポイントを描画する場合はパフォーマンスが大幅に低下します。

各ピクセルが個別に設定される最小限の例: 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()

一度に 1 行のピクセルを設定する最小限の例: 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()
于 2020-10-28T10:59:37.277 に答える