Python как нарисовать пиксель
Система рисования PyQt5 способна обрабатывать векторную графику, изображения и шрифты. Рисование необходимо в приложениях, когда мы хотим изменить или улучшить существующий виджет, или мы создаём пользовательский виджет с нуля. Чтобы сделать рисунок, мы используем API рисования, предоставленное инструментарием PyQt5.
Рисование делается в рамках метода paintEvent(). Код рисования размещается между методами begin() и end() объекта QPainter. Он выполняет низкоуровневое рисование на виджетах и других элементах.
Рисование текста
Мы начинаем с рисования Unicode-текста в окне.
В нашем примере, мы рисуем русский текст. Текст выровнен вертикально и горизонтально.
Рисование делается в пределах paintEvent.
Класс QPainter отвечает за все низкоуровневое рисование. Все методы рисования идут между методами begin() и end().
Фактическое рисование делегируется пользовательскому методу drawText().
Здесь мы определяем ручку и шрифт, которые используются, чтобы рисовать текст.
Метод drawText() рисует текст в окне. Метод rect() события рисования возвращает прямоугольник, который должен быть обновлён.
Рисование точек
Точка – это самый простой графический объект, который может быть нарисован. Это маленькое пятнышко в окне.
В нашем примере, мы произвольным образом рисуем 1000 красных точек в окне.
Мы устанавливаем ручку красного цвета. Мы используем предопределённую цветовую константу Qt.red.
Каждый раз, когда мы меняем размер окна, вызывается paintEvent. Мы получаем текущий размер окна с помощью метода size(). Мы используем размер окна, чтобы распределять точки по всему окну.
Мы рисуем точку с помощью метода drawPoint().
Цвета
Цвет – это объект, представляющий собой комбинацию красного, зелёного и синего (RGB) значений интенсивности. Корректные значения RGB находятся в диапазоне от 0 до 255. Мы можем определить цвет разными способами. Самый распространённый – десятичные или шестнадцатеричные значения RGB. Мы также можем использовать значения RGBA, которые обозначают красный, зелёный, синий и альфа-канал. Здесь мы добавляем немного дополнительной информации относительно прозрачности. Значение альфа 255 определяет полную непрозрачность, 0 – полная прозрачность, т.е. цвет невидим.
В нашем примере, мы рисуем 3 окрашенных прямоугольника.
Здесь мы определяем цвет, используя шестнадцатеричную систему счисления.
Здесь мы определяем кисть и рисуем прямоугольник. Кисть – это элементарный графический объект, который используется, чтобы рисовать фон очертания. Метод drawRect() принимает четыре параметра. Первые два – значения x и y на осях. Третий и четвёртый параметры – ширина и высота прямоугольника. Метод рисует прямоугольник, используя текущие ручку и кисть.
QPen (ручка) – это элементарный графический объект. Он используется, чтобы рисовать линии, кривые и контуры прямоугольников, эллипсов, многоугольников и других фигур.
В нашем примере, мы рисуем шесть линий. Линии рисуются в шести разных стилях ручки. Существует пять предопределённых стилей QPen. Мы также можем создать пользовательские стили. Последняя линия нарисована с использованием пользовательского стиля.
Мы создаём объект QPen. Цвет – чёрный. Ширина устанавливается в 2 пикселя так, чтобы мы могли видеть различия между стилями ручки. Qt.SolidLine – это один из предопределённых стилей (жирная линия).
Здесь мы определяем пользовательский стиль ручки. Мы устанавливаем стиль ручки Qt.CustomDashLine и вызываем метод setDashPattern(). Список чисел определяет стиль. Может быть даже несколько чисел. Нечётные числа определяют сплошную линию, чётные числа – промежутки. Чем больше число, тем больше промежуток или штрих. Наш образец – штрих в 1 пиксель, промежуток в 4 пикселя, штрих в 5 пикселей, промежуток в 4 пикселя, и т.д.
То, что получилось, хорошо видно на картинке.
QBrush
QBrush – это элементарный графический объект. Он используется для рисования фона графических форм, таких как прямоугольники, эллипсы или многоугольники. Кисть может быть трёх разных типов: предопределённая кисть, градиент, образец текстуры.
В нашем примере, мы рисуем девять разных прямоугольников.
Мы определяем объект кисти. Мы устанавливаем его в объект рисования и рисуем прямоугольник с помощью метода drawRect().
В этой части руководства PyQt5, мы рассмотрели некоторые основы рисования.
Я надеюсь, что за короткое время отобразятся различные конфигурации пикселей и цветов - запись в промежуточный файл будет слишком дорогой.
Как мне лучше всего добиться достижения этой цели в Python?
4 ответа
Прямой ответ:
Это может быть сделано только с помощью API для конкретной ОС. Некоторые ОС не позволяют менять пиксели на экране напрямую.
В Windows вы можете использовать pywin32 библиотеки, чтобы получить контекст устройства экрана с помощью вызова dc = GetDC(0) , а затем закрасить пиксели SetPixel(dc, x, y, color) .
Конечно, то, что вы рисуете таким образом, может быть стерто в любой момент.
Правильный ответ:
Рисование пиксель за пикселем - самый медленный способ рисования чего-либо. Например, в Windows создание изображения в памяти и его рисование за одну операцию выполняется на порядок быстрее, чем рисование с помощью SetPixel.
Если вам нужна скорость, используйте некоторую библиотеку пользовательского интерфейса для Python, например, модуль Tkinter или PyQt. Создайте окно и изображение в памяти, затем нарисуйте изображение в окне. Если вам нужно манипулировать пикселями, манипулируйте ими на изображении и перекрашивайте каждый раз.
Я рекомендую вам библиотеку Pygame. Это кроссплатформенная библиотека, хорошо подходящая для общей компьютерной графики и разработки игр. посмотрите здесь некоторые примеры Pygame в действии.
Библиотека довольно простая, но мощная. Вы можете рисовать в окне, а также в полноэкранном режиме.
Хотя это не совсем то, что вы говорите (рисуете «по пикселям»), мне нравится использовать Python, GTK и Cairo.
В этом случае вы создаете окно GTK, добавляете DrawingArea, создаете контекст Cairo и выполняете операции рисования.
Разница в том, что у вас есть непрерывный холст с координатами с плавающей точкой, и вместо пикселей вы рисуете геометрические фигуры штрихами и заливками. Вы могли бы даже нарисовать прямоугольники размером в один пиксель и заполнить их, но это было бы не так быстро.
Также вы можете взять любой растровый объект (изображение, пиксельный буфер) и визуализировать его сразу. Затем вы можете сгенерировать изображения в быстрой последовательности и визуализировать пиксели сразу, как в фильме.
Рабочий пример можно увидеть в предыдущем ответе здесь (второй фрагмент): самый быстрый способ начать работу с cairo
Я не уверен, правильно ли я понял ваш вопрос, но я считаю, что вам следует изучить какую-то инфраструктуру или промежуточное программное обеспечение, которое дает вам доступ к экрану. Я бы сказал, PyGame или Pyglet или, может быть, даже Panda. Это может быть немного излишним, потому что Pygame и Panda - это фреймворк, который позволяет вам разрабатывать игры, в то время как Pyglet является оберткой для Opengl в python, но он позволяет вам легко управлять пикселями, окнами и тому подобным.
Модуль ImageDraw из библиотеки обработки изображений Pillow (PIL) предоставляет методы для рисования круга, квадрата и прямой линии в Python.
Содержание статьи
Создание объекта Draw в Python
Используя объекта Image мы создадим фоновое изображение на которой мы будем рисовать наши фигуры при помощи объекта Draw . Не забудьте импортировать модуль Image и ImageDraw в начале кода.
Здесь создается пустое изображение с размером 500 на 300 пикселей и с тёмно желтым фоном.
Рисуем фигуры в Pillow: ellipse, rectangle и line
Вызываем методы рисования из объекта Draw для рисования фигур на нашем желтом фоне.
Рисуем эллипс, прямоугольник и прямую линию в качестве примера.
draw . ellipse ( ( 100 , 100 , 150 , 200 ) , fill = 'red' , outline = ( 0 , 0 , 0 ) ) draw . rectangle ( ( 200 , 100 , 300 , 200 ) , fill = 'blue' , outline = ( 255 , 255 , 255 ) ) draw . line ( ( 350 , 200 , 450 , 100 ) , fill = 'pink' , width = 10 ) im . save ( 'draw-ellipse-rectangle-line.jpg' , quality = 95 )Справочник по параметрам методов рисования
Даже если, способы рисования отличаются в зависимости от используемого метода, следующие параметры являются общими для всех.
Параметр xy указывает прямоугольную область для рисования новой фигуры.
Уточняется один из следующих форматов:
- (((Верхняя левая x координата, Верхняя левая y координата), (нижняя правая x координата, нижняя правая y координата)) ;
- (Верхняя левая x координата, Верхняя левая y координата, нижняя правая x координата, нижняя правая y координата) .
В методах line() , polygon() и point() используются многочисленные координаты вместо двух точек, представляющих прямоугольную область.
- (x1, y1, x2, y2, x3, y3. ) ;
- ((x1, y1), (x2, y2), (x3, y3). ) .
Метод line() рисует прямую линию, которая связывает каждую точку, polygon() рисует многоугольник, а метод point() рисует точку в 1 пиксель для каждой указанной точки.
Параметр fill указывает какой цвет будет использован для заполнения нашей геометрической формы.
Спецификация формата цвета отличается в зависимости от указанного режима изображения (объект Image ):
- RGB : Указывает значение цвета в форме (R, G, B) ;
- L (Черно-белое): Указывает значение (0-255) как целое число).
Значение по умолчанию None (не заполнено).
Есть три способа указать цвет, возьмем красный цвет, его можно записать так:
Параметр outline указывает на цвет границы фигуры.
Спецификация формата цвета такая же, как и у параметра fill которого мы обсуждали выше. Значение по умолчанию равно None (без границ).
Вне зависимости от рисуемой фигуры, вы можете указать размер в пикселях для границы фигуры.
Рисование эллипса и прямоугольника в Python
- Эллипс (Круг): ellipse(xy, fill, outline) ;
- Прямоугольник (Квадрат): rectangle(xy, fill, outline) .
Метод ellipse() рисует эллипс, область рисования указывается в параметр xy . Если мы зададим четыре координата которые будут соответствовать квадрату, то у нас получится ровный круг.
Я надеюсь отобразить много разных конфигураций пикселей и цветов за короткий промежуток времени-запись в промежуточный файл будет слишком дорогой.
Как мне лучше всего достичь этой цели в Python?
прямого ответа:
Это можно сделать только с OS-специфическими API. Некоторые ОС не позволяют изменять пиксели на экране напрямую.
В Windows вы можете использовать pywin32 библиотеки, чтобы получить контекст устройства экрана с dc = GetDC(0) вызов, затем нарисуйте пиксели с SetPixel(dc, x, y, color) .
конечно, то, что вы рисуете таким образом, может быть стерто в любой момент.
правильный ответ:
живопись пикселей по pixel-это самый медленный способ что-то нарисовать. Например, в Windows создание изображения в памяти, а затем его рисование за одну операцию на порядок быстрее, чем рисование с помощью SetPixel.
Если вам нужна скорость, используйте некоторую библиотеку пользовательского интерфейса для python, например, модуль Tkinter или PyQt. Создайте окно и изображение в памяти, затем нарисуйте изображение на окне. Если вам нужно манипулировать пикселями, манипулируйте ими в изображении и перекрашивайте каждый раз.
Я не уверен, правильно ли я понял ваш вопрос, но я считаю, что вы должны исследовать некоторые рамки или промежуточное ПО, которые дают вам доступ к экрану. Я бы сказал, PyGame или Pyglet или, может быть, даже Panda. Это может быть немного перебор, потому что Pygame и Panda-это фреймворк, который позволяет вам разрабатывать игру, а Pyglet-это оболочка для Opengl в python, но она позволит вам легко управлять пикселями, окнами и т. д.
хотя это не совсем то, что вы говорите (краска "по пикселям"), мне нравится использовать Python, GTK и Cairo.
в этом случае вы создаете окно GTK, добавляете DrawingArea, создаете контекст Cairo и выполняете операции рисования.
разница в том, что у вас есть непрерывный холст с координатами с плавающей запятой, и вместо пикселей вы рисуете геометрические фигуры с штрихами и заливками. Вы даже можете нарисовать прямоугольники размером в один пиксель и заполнить их, но это будет не так быстрый.
кроме того, вы можете взять любой растровый объект (изображение, pixbuffer) и отобразить его сразу. Затем вы можете генерировать изображения в быстрой последовательности и отображать все пиксели сразу, как в фильме.
рабочий пример можно увидеть в предыдущем ответе здесь (второй фрагмент): самый быстрый способ начать работу с cairo
Я рекомендую вам библиотеку Pygame. Это кросс-платформенная библиотека хорошо подходит для общей компьютерной графики и разработки игр. регистрация здесь некоторые примеры Pygame в действии.
библиотека довольно проста, но мощная. Вы можете рисовать в окне, а также в полноэкранном режиме.
Читайте также: