解决Qpen鼠标随意画线时所画线像素不一致问题(实现onenote黄色画笔效果)
问题背景:
Qpen
在画线时,可以选择画笔颜色,即QColor
,一般都是选择三个参数,即R,G,B,例如黑色可以设置为QColor(0,0,0)
,白色即为QColor(255,255,255)
。用户可以根据自己的需要进行选择颜色。
这样的画笔进行画线时即使画的比较快也不会出现中间断断续续的情况,
下面是颜色为黄色的画线展示,即QColor(255,255,0)
,如图:
但是Qpen
还有第四个参数,即设置画笔的透明度,这个范围也是0-255.其中数字越小,颜色越亮,也可以理解为越浅。
下面是画笔设为亮度为30的画线图,即QColor(255,255,0, 30)
:
我们可以看到画笔的颜色是比刚才浅的。
透明度越小,我们越能看到画笔下面的内容
代码示例
pen = QPen(Qt.SolidLine) #将画线设置为实线
pen.setColor(QColor(255,255,0,30)) #设置画笔的颜色和透明度
pen.setWidth(self.linewidth) #设置画笔的宽度
#根据鼠标位值进行随意画线,
painter.drawLine(self.start_point, self.current_point)
想要达到的效果
想要达到画线后画线部分的像素值是稳定的,这样才方便后期的图像提取
问题分析
仅仅刚才的代码无法达到效果
当画线画的比较快时(即鼠标移动比较快时),会出现如下图情况:
显然我们直接用肉眼就可以看出来像素是不一样的。我们也可以进行像素查看,用下面代码:
import cv2
img = cv2.imread('image.jpg',1)
可以看出颜色会有较大波动,这并不是我们想要的结果
问题解决
最后解决这个问题的方式是同时让程序进行画线
即下面代码:
pen = QPen(Qt.SolidLine) #将画线设置为实线
pen.setColor(QColor(255,255,0,30)) #设置画笔的颜色和透明度
pen.setWidth(self.linewidth) #设置画笔的宽度
#根据鼠标位值进行随意画线,
painter.drawLine(self.start_point, self.current_point)
painter.drawLine(self.start_point, self.current_point)
painter.drawLine(self.start_point, self.current_point)
painter.drawLine(self.start_point, self.current_point)
painter.drawLine(self.start_point, self.current_point)
painter.drawLine(self.start_point, self.current_point)
painter.drawLine(self.start_point, self.current_point)
painter.drawLine(self.start_point, self.current_point)
painter.drawLine(self.start_point, self.current_point)
painter.drawLine(self.start_point, self.current_point)
然后再次尝试快速画线:
可以很明显的看到此时达到了颜色均匀的需求,并且是透明的实线
此时我们再次进行像素读取:
我们通过opencv进行读取,发现确实是一样的,至此我们就完成了需求。
但是这个原理我并不明白,望大佬不吝赐教
其实用过onenote的小伙伴应该知道,onenote上面的那个黄色的画笔和刚才实现的效果是一样的