Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/29: Рейтинг темы: голосов - 29, средняя оценка - 4.97
 Аватар для Михалыч
1011 / 355 / 59
Регистрация: 28.02.2013
Сообщений: 939

Рисование на картинке

27.11.2019, 15:15. Показов 6130. Ответов 5

Студворк — интернет-сервис помощи студентам
Доброго дня, как нарисовать по верх картинки линию?

Сначала у меня:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
        #создаем сцену
        self.scene = QGraphicsScene(self)
        # создаем полосы прокрутки
        area = QScrollArea(self)
        #self.rings = []
        # добавляем картинку
        self.pixmap = QPixmap("image.jpg")
        self.scene.addPixmap(self.pixmap)
        
        # создаем вид который визуализирует сцену
        self.view = QGraphicsView(self.scene)
        area.setWidget(self.view)
        area.setWidgetResizable(True)
потом есть кнопка, которая связана с функцией рисования:
Python
1
2
darw_radius = QPushButton("Рисовать",self)
darw_radius.clicked.connect(self.draw)# функция рисования

Как мне правильно написать, что бы поверх картинки рисовалась линия?

Python
1
2
3
4
5
6
7
    def draw(self, paintEvent):
        print('draw')
        painter = QPainter(self.pixmap)
        painter.begin(self)
        painter.setPen(QPen(Qt.red, 10))
        painter.drawLine(0,0, 200,200)
        painter.end()
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.11.2019, 15:15
Ответы с готовыми решениями:

рисование на картинке
Друзья, нужна ваша помощь. Я хочу вывести картинку и затем на ней отмечать нужные объекты, например с помощью QRect. Подскажите куда лучше...

Рисование по картинке
Хай! Подскажите плиз как рисовать по картинке в яваскрипт...

Рисование по картинке
Добрый день! Не могу по картинке нарисовать линию по нормальным координатам... Подскажите как это сделать? Вот класс кастомного...

5
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
27.11.2019, 16:40
Python
1
2
3
4
5
6
7
8
    def draw(self, paintEvent):
        print('draw')
        painter = QPainter(self.pixmap)
        painter.begin()
        painter.setPen(QPen(Qt.red, 10))
        painter.drawLine(0,0, 200,200)
        painter.end()
        self.update()
0
 Аватар для Михалыч
1011 / 355 / 59
Регистрация: 28.02.2013
Сообщений: 939
28.11.2019, 09:10  [ТС]
vic5710, не помогло(

Python
1
2
3
4
5
Original exception was:
Traceback (most recent call last):
  File "C:\Users\Konstantin_user\Desktop\ellipse_draw.py", line 196, in draw
    painter.begin()
TypeError: begin(self, QPaintDevice): not enough arguments
Добавлено через 5 минут
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#!/usr/bin/python3
# -*- coding: utf-8 -*-
 
import sys
 
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
 
 
 
class Example(QWidget):
 
    def __init__(self):
        super().__init__()
 
        self.initUI()
 
    def initUI(self):
 
 
        #создаем сетку
        grid = QGridLayout(self)
        grid.setColumnStretch(0, 7)
        grid.setColumnStretch(1, 1)
        #создаем сцену
        self.scene = QGraphicsScene(self)
        # создаем полосы прокрутки
        area = QScrollArea(self)
        #self.rings = []
        # добавляем картинку
        self.pixmap = QPixmap("image.jpg")
        self.scene.addPixmap(self.pixmap)
        
        # создаем вид который визуализирует сцену
        self.view = QGraphicsView(self.scene)
        area.setWidget(self.view)
        area.setWidgetResizable(True)
        
 
        # создаем кнопки и пр.
        darw_radius = QPushButton("Рисовать линию",self)
 
 
        # создаем опработчики кнопок
        darw_radius.clicked.connect(self.draw)# функция рисования линий
 
 
        # упаковываем в контейнер и в сетку
        vbox = QVBoxLayout(self)
        vbox.setContentsMargins(0, 0, 0, 0)
        box = QGroupBox(self)
        
        vbox.addWidget(darw_radius)
        box.setLayout(vbox)
 
        verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
 
        grid.addWidget(area, 0, 0, -1, 1)
        grid.addWidget(box, 0, 1, 1, 1)
        grid.addItem(verticalSpacer, 1, 1, 1, 1)
        
        self.setLayout(grid)
 
 
        self.move(300, 200)
        self.setWindowTitle('Red Rock')
        self.show()
 
    def draw(self, paintEvent):
        print('draw')
        painter = QPainter(self.pixmap)
        painter.begin()
        painter.setPen(QPen(Qt.red, 10))
        painter.drawLine(0,0, 200,200)
        painter.end()
        self.update()
        
        
def my_excepthook(type, value, tback):# что бы ошибка PyQ не исчезала
    QMessageBox.critical(
        window, "CRITICAL ERROR", str(value),
        QMessageBox.Cancel
    )
 
    sys.__excepthook__(type, value, tback)
 
 
sys.excepthook = my_excepthook
 
if __name__ == '__main__':
 
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
0
 Аватар для Михалыч
1011 / 355 / 59
Регистрация: 28.02.2013
Сообщений: 939
28.11.2019, 15:21  [ТС]
Блин, примеров куча по рисованию на картинке, но картинка расположена на QWidget... А у меня на QGraphicsScene
Видимо картинку после рисования как-то обновить на сцене надо
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
04.12.2019, 20:29
Цитата Сообщение от Михалыч Посмотреть сообщение
А у меня на QGraphicsScene
на ней надо
https://doc.qt.io/QT-5/qgraphicsscene.html#addLine
1
 Аватар для Михалыч
1011 / 355 / 59
Регистрация: 28.02.2013
Сообщений: 939
13.12.2019, 11:16  [ТС]
Для себя сохраню) Может кому еще пригодится.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import sys
from PyQt5 import QtCore
from PyQt5.QtGui import QPixmap, QPainter, QPen, QColor, QImage
from PyQt5.QtWidgets import QMainWindow, QApplication, QGraphicsScene, QGraphicsView
from PyQt5.QtCore import Qt, QRect
from PIL import Image, ImageDraw
from PIL.ImageQt import ImageQt
 
class Shufti(QMainWindow):
 
    def __init__(self):
        super().__init__()
        self.resize(800, 600)
        self.initUI()
        self.zoom = 1
        self.ctrl = False
        self.zoomFactor = 1.15
        self.zoomCtrlFactor = 1.01
        self.print = False
        self.pixmap = None
        self.mPixmap = QPixmap()
        self.func = (None, None)
        self.mModified = True
        self.currentRegion = QRect(50, 50, 50, 80)
 
 
 
    def initUI(self):   
 
        tempImage = Image.new('RGBA', (1177, 588))
        tempDraw = ImageDraw.Draw(tempImage)
       
        x = 200
        y = 200
        r = 250
        
        tempDraw.ellipse((x - r, y - r, x + r, y + r), 
            fill = (255, 0, 0, 100))
        tempDraw.ellipse((x+100 - r, y+100 - r, x+100 + r, y+100 + r), 
            fill = (255, 0, 0, 100))
##        tempDraw.ellipse((x - (r-5), y - (r-5), x + (r-5), y + (r-5)), 
##            fill = (0, 0, 0, 0))
##        tempDraw.ellipse((x+100 - (r-5), y+100 - (r-5), x+100 + (r-5), y+100 + (r-5)), 
##            fill = (0, 0, 0, 0))
 
 
        self.image = Image.open('image.jpg').convert("RGBA")
 
        Image.alpha_composite(self.image, tempImage)
 
        qim = ImageQt(tempImage)
 
        self.img2 = QPixmap.fromImage(qim) 
 
 
        self.img = QPixmap('image.jpg')
        self.scene = QGraphicsScene()
        self.pix = self.scene.addPixmap(self.img)
        # self.scene.addPixmap(img2)
        self.view = QGraphicsView(self.scene, self)
        self.view.resize(self.img.width() + 2, self.img.height() + 2)
        self.view.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        self.view.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        self.show()
 
    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Q:
            # print('q')
            # self.func = (self.drawFundBlock, {})
            # self.mModified = True
            # self.update()
            self.scene.addPixmap(self.img2)
        if QtCore.Qt.ControlModifier:
            self.ctrl = True 
        if event.key() == QtCore.Qt.Key_F:
            self.scene.removeItem(self.pix)
 
    def keyReleaseEvent(self, event):
        if event.type() == QtCore.QEvent.KeyRelease:
           if QtCore.Qt.ControlModifier:
                self.ctrl = False 
  
 
    def wheelEvent(self, event):
        self.view.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)
        factor = self.zoomCtrlFactor if event.modifiers() & Qt.ControlModifier else self.zoomFactor;
        if event.angleDelta().y() > 0:
            self.view.scale(factor, factor)
        else:
            self.view.scale(1.0 / factor, 1.0 / factor)
 
    def paintEvent(self, event):
        if self.mModified:
            rect = self.view.sceneRect()
            pixmap = QPixmap(rect.width(), rect.height())
            pixmap.fill(Qt.transparent)
            painter = QPainter(pixmap)
            painter.drawPixmap(0, 0, self.mPixmap)
            self.drawBackground(painter)
            self.mPixmap = pixmap
            self.mModified = False
 
        qp = QPainter(self)
        qp.drawPixmap(0, 0, self.mPixmap)
        self.scene.addPixmap(self.mPixmap)
 
    def drawBackground(self, qp):
        func, kwargs = self.func
        if func is not None:
            kwargs["qp"] = qp
            func(**kwargs)
 
    def drawFundBlock(self, qp):
        pen = QPen(Qt.black, 2, Qt.SolidLine)
        pen.setStyle(Qt.DashLine)
 
        qp.setPen(pen)
        qp.setBrush(Qt.red);
        qp.drawEllipse(40, 40, 400, 400)
        qp.setBrush(QColor(100, 100, 100, 0))
        pen = QPen(QColor(100, 100, 100, 0), 2, Qt.SolidLine)
        qp.drawEllipse(50, 50, 380, 380)
 
if __name__ == '__main__':
 
    app = QApplication(sys.argv)
    shufti = Shufti()
    sys.exit(app.exec_())
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.12.2019, 11:16
Помогаю со студенческими работами здесь

Рисование прямой на картинке
Добрый день,есть вот такой код,программа просто отрисовывает прямую.Как сделать так,чтобы она рисовала по картинке?Картинку на сцену не...

[Delphi XE5] рисование текста на картинке
как в delphi xe5 можно написать текст на картинке пробовал такой вариант неподходит image.Canvas.Font.Color:=clred; //Цвет ...

Из двух папок выбирать по картинке и возвращать каждый раз полный путь к следующей картинке
Здравствуйте. Помогите, пожалуйста, с данной проблемой. Даны 2 папки. Нужно написать функцию, которая по очереди из этих папок выбирает по...

Рисование Рисование точек по координатам
Доброе время суток. Помогите мне наглядным примером. У меня есть массив координат a х у 1 2 3 4 1 3 кпримеру, мне нужно...

По картинке
Грузик подвешеный на нити, совершает свободные колебания между точками A и С. Как направлен вектор ускорения грузика в точке B ?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru