问题背景:

Qpen在画线时,可以选择画笔颜色,即QColor,一般都是选择三个参数,即R,G,B,例如黑色可以设置为QColor(0,0,0),白色即为QColor(255,255,255)。用户可以根据自己的需要进行选择颜色。

这样的画笔进行画线时即使画的比较快也不会出现中间断断续续的情况,

下面是颜色为黄色的画线展示,即QColor(255,255,0),如图:

如何实现Microsoft OneNote黄色画笔效果

但是Qpen还有第四个参数,即设置画笔的透明度,这个范围也是0-255.其中数字越小,颜色越亮,也可以理解为越浅。

下面是画笔设为亮度为30的画线图,即QColor(255,255,0,30):

如何实现Microsoft OneNote黄色画笔效果

我们可以看到画笔的颜色是比刚才浅的。

透明度越小,我们越能看到画笔下面的内容

代码示例

pen=QPen(Qt.SolidLine)#将画线设置为实线

pen.setColor(QColor(255,255,0,30))#设置画笔的颜色和透明度

pen.setWidth(self.linewidth)#设置画笔的宽度

#根据鼠标位值进行随意画线,

painter.drawLine(self.start_point,self.current_point)

想要达到的效果

想要达到画线后画线部分的像素值是稳定的,这样才方便后期的图像提取

问题分析

仅仅刚才的代码无法达到效果

当画线画的比较快时(即鼠标移动比较快时),会出现如下图情况:

如何实现Microsoft OneNote黄色画笔效果

显然我们直接用肉眼就可以看出来像素是不一样的。我们也可以进行像素查看,用下面代码:

importcv2

img=cv2.imread(‘image.jpg’,1)

如何实现Microsoft OneNote黄色画笔效果

如何实现Microsoft OneNote黄色画笔效果

可以看出颜色会有较大波动,这并不是我们想要的结果

问题解决

最后解决这个问题的方式是同时让程序进行画线

即下面代码:

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)

然后再次尝试快速画线:

如何实现Microsoft OneNote黄色画笔效果

可以很明显的看到此时达到了颜色均匀的需求,并且是透明的实线

此时我们再次进行像素读取:

如何实现Microsoft OneNote黄色画笔效果

我们通过opencv进行读取,发现确实是一样的,至此我们就完成了需求。

但是这个原理我并不明白,望大佬不吝赐教

其实用过onenote的小伙伴应该知道,onenote上面的那个黄色的画笔和刚才实现的效果是一样的

——————————————————————————————

更新:

今天又发现了另外一种导致像素不一致的原因;

例如用像素(0,255,255)的画笔在.tif格式上的图片画线后,如果将画线后的图片保存为.jpg,然后读取图片的像素值发现会有一些像素差,变成了(3,254,255),其他颜色也是这样。所以推测图片间的格式转换会导致像素微变。目前还不确定,待以后进一步学习

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注