Bezdepbonusu7Программирование: статьи и ответы

Вопрос

В 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

pythonpixel

Ответы

Ответ 1 · рейтинг 24 · hamstergene

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

Это можно сделать только с помощью 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 и выполняете операции рисования.

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы