QT绘图 橡皮擦效果的实现
前言
为了处理一些简单图片的后期处理,制作了一个简单的橡皮擦功能脚本。用来处理机器视觉中的图像处理。
开发工具
python版本:
3.6.5
相关模块:
PyQt5
CV2
numpy
PIL
环境搭建
python添加到变量,pip安装相关模块
效果
原理介绍
主要通过pyqt5 实现UI界面,设置鼠标响应。通过鼠标左键点击获取图像当前坐标点的位置和RGBA值,然后返回RGBA值给画笔,设置画笔对应的RGBA值。通过鼠标的移动覆盖不同颜色的区域,这样就实现了橡皮擦的效果。
实现内容:
# -*- coding: utf-8 -*-
from PIL import Image
import cv2
import numpy as np
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPainter, QPixmap, QPen ,QColor
from PyQt5.QtCore import Qt, QPoint
img_path = "C:\\Users\\DELL\\Desktop\\11.18\\1-1.png"
class Winform(QWidget):
def __init__(self, parent=None):
super(Winform, self).__init__(parent)
self.setWindowTitle("橡皮擦")
self.pix = QPixmap() # 实例化一个 QPixmap 对象
self.lastPoint = QPoint() # 起始点
self.endPoint = QPoint() # 终点
self.initUi()
self.r = 0
self.g = 0
self.b = 0
self.a = 255
def initUi(self):
try:
# 窗口大小设置为600*500
self.resize(512, 512)
# 画布大小为400*400,背景为白色
self.pix = QPixmap(500, 500)
self.pix.load(img_path)
# self.pix.fill(Qt.white)
except:
print("1")
# 重绘的复写函数 主要在这里绘制
# 鼠标按压事件
def mousePressEvent(self, event):
# 鼠标左键按下
try:
if event.button() == Qt.LeftButton:
# print("按下")
# print("按压坐标",event.pos(),event.x())
# 获取图片的RGB数值和坐标
im = Image.open(img_path)
pix = im.load()
print("pix",pix)
img_RGBA = pix[event.x(), event.y()]
if len(img_RGBA) == 4:
self.r, self.g, self.b ,self.a = img_RGBA
elif len(img_RGBA) == 3:
self.r, self.g, self.b = img_RGBA
else:
self.r, self.g, self.b = img_RGBA
# print("img3",self.r, self.g, self.b, self.d)
print("RGB:",pix[event.x(), event.y()],"坐标:", (event.x(), event.y()))
self.lastPoint = event.pos()
self.endPoint = self.lastPoint
except:
print("2")
# 鼠标移动事件
def mouseMoveEvent(self, event):
# 鼠标左键按下的同时移动鼠标
try:
if event.buttons() and Qt.LeftButton:
# print("移动坐标", event.pos())
self.endPoint = event.pos()
# 进行重新绘制
self.update()
except:
print("3")
# 鼠标释放事件
def mouseReleaseEvent(self, event):
# 鼠标左键释放
try:
if event.button() == Qt.LeftButton:
self.endPoint = event.pos()
# print("释放坐标", event.pos())
# 进行重新绘制
self.update()
except:
print("4")
def paintEvent(self, event):
try:
# print("绘画")
pp = QPainter(self.pix)
pen = QPen(QColor(self.r, self.g, self.b, self.a)) # 定义笔格式对象
pen.setWidth(20) # 设置笔的宽度
pp.setPen(pen) # 将笔格式赋值给 画笔
# 根据鼠标指针前后两个位置绘制直线
pp.drawLine(self.lastPoint, self.endPoint)
# 让前一个坐标值等于后一个坐标值,
# 这样就能实现画出连续的线
self.lastPoint = self.endPoint
painter = QPainter(self)
painter.drawPixmap(0, 0, self.pix) # 在画布上画出
self.pix.save(save_path)
except:
print("5")
if __name__ == "__main__":
app = QApplication(sys.argv)
form = Winform()
form.show()
sys.exit(app.exec_())