В Python, как я могу напрямую рисовать пиксель на экране?
Автор вопроса: Matthieu CartierОтветов: 3
Я хочу сделать что-то вроде следующего:
...
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?
Обычно вы не хотите писать на экран, вы хотите писать в окно. В Python нет встроенных пакетов для взаимодействия с окном, вам нужно будет что-то выбрать и установить. Mark Ransom 28.09.2011
@MarkRansom - Верно. Окно без полей также было бы приемлемо. Matthieu Cartier 28.09.2011
Если бы вы знали, как выполнить эту запись в файл, вы могли бы записать в память, используя cStringIO, хотя я не думаю, что это так. heltonbiker 28.09.2011
@Mark Ransom: с помощью tkinter вы можете создавать и отображать окна. Встроенный. glglgl 28.09.2011
Связано: Как отобразить текст на экране без окна с помощью Python Stevoisiak 31.07.2018
Это можно сделать только с помощью 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. Создайте окно и изображение в памяти, затем нарисуйте изображение на окне. Если вам нужно манипулировать пикселями, манипулируйте ими на изображении и каждый раз перекрашивайте.
Ответ 2 · рейтинг 3 · Drachenfels
Я не уверен, правильно ли я понял ваш вопрос, но я считаю, что вам следует изучить некоторые фреймворки или промежуточное программное обеспечение, которые дают вам доступ к экрану. Я бы сказал PyGame или Pyglet или, может быть, даже Panda. Это может быть немного излишним, потому что Pygame и Panda - это фреймворк, который позволяет вам разрабатывать игры, в то время как Pyglet является оболочкой для Opengl в python, но он позволит вам легко управлять пикселями, окнами и подобным.
Ответ 3 · рейтинг 3 · heltonbiker
Хотя это не совсем то, что вы говорите (рисовать "по пикселям"), мне нравится использовать Python, GTK и Cairo.
В этом случае вы создаете окно GTK, добавляете DrawingArea, создаете контекст Cairo и выполняете операции рисования.
Отличие в том, что у вас сплошной холст с координатами с плавающей запятой, а вместо пикселей вы рисуете геометрические фигуры с штрихами и заливками. Можно даже рисовать прямоугольники размером в один пиксель и заполнять их, но это будет не так быстро.
Кроме того, вы можете взять любой растровый объект (изображение, пиксбуфер) и сразу отрендерить его. Затем вы можете генерировать изображения в быстрой последовательности и отображать все их пиксели одновременно, как в кино.