В Python, как я могу нарисовать пиксель на экране напрямую? - PullRequest
9 голосов
/ 28 сентября 2011

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

...
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?

Ответы [ 4 ]

21 голосов
/ 28 сентября 2011

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

Это можно сделать только с помощью 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.Создайте окно и изображение в памяти, затем нарисуйте изображение в окне.Если вам нужно манипулировать пикселями, манипулируйте ими на изображении и перекрашивайте каждый раз.

3 голосов
/ 28 сентября 2011

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

2 голосов
/ 28 сентября 2011

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

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

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

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

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

1 голос
/ 29 сентября 2011

Я рекомендую вам библиотеку Pygame.Это кроссплатформенная библиотека, хорошо подходящая для общей компьютерной графики и разработки игр. Проверьте здесь некоторые примеры Pygame в действии.

Библиотека довольно простая, но мощная.Вы можете рисовать в окне, а также в полноэкранном режиме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...