В Python, как я могу напрямую рисовать пиксель на экране?

Я хочу сделать что-то вроде следующего:

...
pixel[0,0] = [ 254, 0, 0 ] # Draw R at pixel x0y0
pixel[2,1] = [ 0, 254, 0 ] # Draw G at pixel x2y1
pixel[4,2] = [ 0, 0, 254 ] # Draw B at pixel x4y2
...

Я надеюсь отобразить множество различных конфигураций пикселей и цветов за короткий промежуток времени — запись в промежуточный файл была бы слишком дорогой.

Как мне лучше всего достичь этой цели в Python?


person Matthieu Cartier    schedule 28.09.2011    source источник
comment
Обычно вы не хотите писать на экран, вы хотите писать в окно. В Python нет встроенных пакетов для взаимодействия с окном, вам нужно будет что-то выбрать и установить.   -  person Mark Ransom    schedule 28.09.2011
comment
@MarkRansom - Верно. Окно без полей также было бы приемлемо.   -  person Matthieu Cartier    schedule 28.09.2011
comment
Если бы вы знали, как выполнить эту запись в файл, вы могли бы записать в память, используя cStringIO, хотя я не думаю, что это так.   -  person heltonbiker    schedule 28.09.2011
comment
@Mark Ransom: с помощью tkinter вы можете создавать и отображать окна. Встроенный.   -  person glglgl    schedule 28.09.2011
comment
Связано: Как отобразить текст на экране без окна с помощью Python   -  person Stevoisiak    schedule 31.07.2018


Ответы (3)


Прямой ответ:

Это можно сделать только с помощью API для конкретной ОС. Некоторые ОС не позволяют изменять пиксели на экране напрямую.

В Windows вы можете использовать библиотеки pywin32 для получения контекста устройства экрана с помощью вызова dc = GetDC(0), а затем рисовать пиксели с помощью SetPixel(dc, x, y, color) .

import win32gui
import win32api

dc = win32gui.GetDC(0)
red = win32api.RGB(255, 0, 0)
win32gui.SetPixel(dc, 0, 0, red)  # draw red at 0,0

Конечно, то, что вы нарисуете таким образом, может быть стерто в любой момент.

Правильный ответ:

Рисование по пикселям — самый медленный способ нарисовать что-либо. Например, в Windows создание изображения в памяти и его рисование за одну операцию выполняется на порядок быстрее, чем рисование с помощью SetPixel.

Если вам нужна скорость, используйте какую-нибудь библиотеку пользовательского интерфейса для python, например модуль Tkinter или PyQt. Создайте окно и изображение в памяти, затем нарисуйте изображение на окне. Если вам нужно манипулировать пикселями, манипулируйте ими на изображении и каждый раз перекрашивайте.

person hamstergene    schedule 28.09.2011
comment
Вы знаете, как сделать то же самое на Ubuntu? - person killajoule; 10.12.2016
comment
Как я могу отменить пиксель, нарисованный с помощью win32gui.SetPixel? - person Amin Guermazi; 15.05.2020

Я не уверен, правильно ли я понял ваш вопрос, но я считаю, что вам следует изучить некоторые фреймворки или промежуточное программное обеспечение, которые дают вам доступ к экрану. Я бы сказал PyGame или Pyglet или, может быть, даже Panda. Это может быть немного излишним, потому что Pygame и Panda — это фреймворк, который позволяет вам разрабатывать игры, в то время как Pyglet является оболочкой для Opengl в python, но он позволит вам легко управлять пикселями, окнами и подобным.

person Drachenfels    schedule 28.09.2011
comment
Некоторые люди также любят играть с вещами, не заботясь о том, что уже существует библиотека, которая сделает это в 100 раз быстрее. - person Joel M; 12.02.2020

Хотя это не совсем то, что вы говорите (рисовать «по пикселям»), мне нравится использовать Python, GTK и Cairo.

В этом случае вы создаете окно GTK, добавляете DrawingArea, создаете контекст Cairo и выполняете операции рисования.

Отличие в том, что у вас сплошной холст с координатами с плавающей запятой, а вместо пикселей вы рисуете геометрические фигуры с штрихами и заливками. Можно даже рисовать прямоугольники размером в один пиксель и заполнять их, но это будет не так быстро.

Кроме того, вы можете взять любой растровый объект (изображение, пиксбуфер) и сразу отрендерить его. Затем вы можете генерировать изображения в быстрой последовательности и отображать все их пиксели одновременно, как в кино.

Рабочий пример можно увидеть в предыдущем ответе здесь (второй фрагмент): самый быстрый способ начать работу с cairo

person heltonbiker    schedule 28.09.2011