序文
前回のブログでは
Pyqt5とopencvで写真の背景色を変える_治りにくい狂気のブログ - CSDNブログ
ボードを描画するために使用されますが、ブラシが設定されていません。これを踏まえてブラシを操作していきます。より良い描画
文章
まずは実行後の動作を見てみましょう
操作する
まず画像を開く必要があります
たとえば、これ
取得したら、全画面表示でメインページから飛び出てください
より簡単に
ボタンは 2 つあり、1 つはペンで、ペンを設定するために使用されます。
もう一つは節約することです
ペン
ペンをクリックします
上に示すように、メイン ページにダイアログ ボックスが表示されます。
この時点でペン、ペンの色、ペンの線種などを選択できます。
選択後、「OK」ボタンをクリックする必要があります。「キャンセル」をクリックするとダイアログボックスが閉じられ、何も起こりません。
絵に絵が描けない
「OK」をクリックすると、--- ペンが表示されます。
ボタン ペンをもう一度クリックすると、最後の選択範囲が表示されます。これはキャッシュに相当します。
メインページを閉じない限り、キャッシュが残ります。
ソースコード
メインのソースコード
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from 草稿本.demo_pen import Ui_Form
import os
class Board(QWidget):
def __init__(self,picture,spin,color=Qt.black):
super().__init__()
self.pen = None
self.paint =QPainter(self)
self.spin=spin
self.color=color
self.picture=picture
def paintEvent(self, e):
if self.picture:
self.paint.begin(self)
self.paint.drawPixmap(0,0,self.picture)
self.paint.end()
def get_picture(self,picture):
self.clear()
self.picture=picture
def get_pen(self,pen):
self.pen=pen
def clear(self):
self.picture.fill(Qt.white)
def mouseMoveEvent(self, e):
if self.picture:
if self.pen:
self.paint.begin(self.picture)
self.paint.setPen(self.pen)
self.paint.drawPoint(e.pos())
self.paint.end()
self.update()
def change_spin(self,spin):
self.spin=spin
def get_color(self,color):
self.color=color
def save(self):
image = self.picture.toImage()
return image
class Pen(QDialog,Ui_Form):
def __init__(self,pen_style=1,sp_value=0,qss=None):
super().__init__()
self.qss = qss
self.sb_value = sp_value
self.pen_style = pen_style
self.setupUi(self)
self.__pen=QPen()
self.initui()
def initui(self):
self.comboBox.addItems(['Nopen','SolidLine','DashLine','DotLine','DashDotLine','DashDotDotLine','CustomDashLine'])
self.comboBox.currentIndexChanged.connect(self.change_index)
self.setpen()
def change_index(self):
self.pen_style=self.comboBox.currentIndex()
def setpen(self):
self.comboBox.setCurrentIndex(self.pen_style)
self.spinBox.setValue(self.sb_value)
self.btncolor.setStyleSheet(self.qss)
def getpen(self):
index=self.comboBox.currentIndex()
self.__pen.setStyle(Qt.PenStyle(index))
self.__pen.setWidth(self.spinBox.value())
color=self.btncolor.palette().color(QPalette.Button)
self.__pen.setColor(color)
return self.__pen
def get_init_data(self):
return [self.pen_style,self.sb_value,self.qss]
@pyqtSlot(int)
def on_spinBox_valueChanged(self,value):
self.sb_value=value
@pyqtSlot()
def on_btncolor_clicked(self):
color=QColorDialog.getColor()
if color.isValid():
qss = f"background-color:rgb({color.red()},{color.green()},{color.blue()});"
self.qss=qss
self.btncolor.setStyleSheet(qss)
@pyqtSlot()
def on_loser_clicked(self):
self.close()
@pyqtSlot()
def on_ok_clicked(self):
self.accept()
class Main(QWidget):
def __init__(self,picture):
super().__init__()
self.pen_init = None
self.v2 = None
self.pen = None
self.nums = None
self.iters = None
self.picture = None
self.cv_img = None
self.color = None
self.color_change = None
self.board = None
self.size = None
self.spin = None
self.pen_window=None
self.paint = None
self.img = None
self.filename = picture
self.initui()
def initui(self):
self.setWindowTitle('核心')
self.pen_init=[1,0,None]
self.set_layout()
def set_layout(self):
h=QHBoxLayout(self)
v1= QHBoxLayout(self)
self.v2=QVBoxLayout(self)
v1.addWidget(self.get_paint())
widgets=self.get_widget()
for i in widgets:
self.v2.addWidget(i)
h.addLayout(v1)
h.addLayout(self.v2)
return h
def get_widget(self):
pen=QPushButton('笔',self)
pen.clicked.connect(self.pen_click)
save=QPushButton('保存',self)
save.clicked.connect(self.save_picture)
return pen,save
def pen_click(self):
self.pen=Pen(pen_style=self.pen_init[0],sp_value=self.pen_init[1],qss=self.pen_init[2])
self.v2.addWidget(self.pen)
ret=self.pen.exec()
if ret==QDialog.Accepted:
self.pen_init=self.pen.get_init_data()
self.board.get_pen(self.pen.getpen())
def save_picture(self):
path,ok = QFileDialog.getSaveFileName(self, '保存图片', '.\\', '(*.jpg *.png)')
if ok:
img=self.board.save()
img.save(path)
def get_paint(self):
image=QPixmap(self.filename)
self.board=Board(image,self.size)
return self.board
class Start(QWidget):
def __init__(self):
super().__init__()
self.filename=None
self.main=None
self.initui()
def initui(self):
self.resize(640,480)
self.setWindowTitle('主页面')
self.set_layout()
def set_layout(self):
v1=QHBoxLayout(self)
open_btn=self.get_btn()
v1.addWidget(open_btn)
return v1
def get_btn(self):
btn1=QPushButton('打开图片',self)
btn1.clicked.connect(self.open)
return btn1
def open(self):
filename, ok = QFileDialog.getOpenFileName(self, '打开文件', os.getcwd(), '(*.jpg *.png)')
if ok:
self.filename=filename
self.main=Main(self.filename)
self.main.setWindowModality(Qt.ApplicationModal)
self.main.showMaximized()
def paintEvent(self, a0):
paint = QPainter(self)
pixmap = QPixmap('C:/Users/520/PycharmProjects/pythonProject4/图片/图片/29.jpg')
paint.drawPixmap(self.rect(), pixmap)
if __name__ == '__main__':
app = QApplication(sys.argv)
a = Start()
a.show()
app.exec_()
二次ソースコード
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'pen.ui'
#
# Created by: PyQt5 UI code generator 5.15.8
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(400, 300)
self.label = QtWidgets.QLabel(Form)
self.label.setGeometry(QtCore.QRect(60, 30, 111, 31))
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(Form)
self.label_2.setGeometry(QtCore.QRect(30, 90, 61, 20))
self.label_2.setObjectName("label_2")
self.comboBox = QtWidgets.QComboBox(Form)
self.comboBox.setGeometry(QtCore.QRect(80, 90, 141, 22))
self.comboBox.setCurrentText("")
self.comboBox.setObjectName("comboBox")
self.label_3 = QtWidgets.QLabel(Form)
self.label_3.setGeometry(QtCore.QRect(20, 150, 72, 15))
self.label_3.setObjectName("label_3")
self.spinBox = QtWidgets.QSpinBox(Form)
self.spinBox.setGeometry(QtCore.QRect(81, 150, 81, 22))
self.spinBox.setObjectName("spinBox")
self.label_4 = QtWidgets.QLabel(Form)
self.label_4.setGeometry(QtCore.QRect(10, 210, 72, 15))
self.label_4.setObjectName("label_4")
self.btncolor = QtWidgets.QPushButton(Form)
self.btncolor.setGeometry(QtCore.QRect(80, 200, 93, 28))
self.btncolor.setText("")
self.btncolor.setObjectName("btncolor")
self.ok = QtWidgets.QPushButton(Form)
self.ok.setGeometry(QtCore.QRect(260, 70, 93, 28))
self.ok.setObjectName("ok")
self.loser = QtWidgets.QPushButton(Form)
self.loser.setGeometry(QtCore.QRect(260, 160, 93, 28))
self.loser.setObjectName("loser")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.label.setText(_translate("Form", "pen设置属性"))
self.label_2.setText(_translate("Form", "线型"))
self.label_3.setText(_translate("Form", "线宽"))
self.label_4.setText(_translate("Form", "颜色"))
self.ok.setText(_translate("Form", "确定"))
self.loser.setText(_translate("Form", "取消"))