c/c++语言开发共享利用PyQt5中QLabel组件实现亚克力磨砂效果

前言windows10 在 uwp 应用中支持亚克力画刷,可以在部件的底部绘制亚克力效果的背景图。下面我们使用 qlabel 来模拟这个磨砂过程。实现方法msdn 文档中介绍了亚克力材料的配方,包括:

前言

windows10 在 uwp 应用中支持亚克力画刷,可以在部件的底部绘制亚克力效果的背景图。下面我们使用 qlabel 来模拟这个磨砂过程。

实现方法

msdn 文档中介绍了亚克力材料的配方,包括:高斯模糊、亮度混合、色调混合和噪声纹理。

利用PyQt5中QLabel组件实现亚克力磨砂效果

高斯模糊

我们先来实现高斯模糊的效果,使用 scipy 可以很轻松的实现这个过程:

# coding:utf-8  import numpy as np  from pil import image  from pyqt5.qtgui import qpixmap  from scipy.ndimage.filters import gaussian_filter      def gaussianblur(imagepath: str, blurradius=18, brightfactor=1, blurpicsize: tuple = none) -> np.ndarray:      """ 对图片进行高斯模糊处理        parameters      ----------      imagepath: str          图片路径        blurradius: int          模糊半径        brightfactor:float          亮度缩放因子        blurpicsize: tuple          高斯模糊前将图片缩放到指定大小,可以加快模糊速度        returns      -------      image: `~np.ndarray` of shape `(w, h, c)`          高斯模糊后的图像      """      if not imagepath.startswith(':'):          image = image.open(imagepath)      else:          image = image.fromqpixmap(qpixmap(imagepath))        if blurpicsize:          # 调整图片尺寸,减小计算量,还能增加额外的模糊          w, h = image.size          ratio = min(blurpicsize[0] / w, blurpicsize[1] / h)          w_, h_ = w * ratio, h * ratio            if w_ < w:              image = image.resize((int(w_), int(h_)), image.antialias)        image = np.array(image)        # 处理图像是灰度图的情况      if len(image.shape) == 2:          image = np.stack([image, image, image], axis=-1)        # 对每一个颜色通道分别磨砂      for i in range(3):          image[:, :, i] = gaussian_filter(              image[:, :, i], blurradius) * brightfactor        return image  

亚克力纹理

接下来在 qlabel 上面绘制出亮度混合、色调混合和噪声纹理,一般色调混合使用的颜色是图像的主题色,可以用 colorthief 库提取,这里就不赘述了:

class acrylictexturelabel(qlabel):      """ 亚克力纹理标签 """        def __init__(self, tintcolor: qcolor, luminositycolor: qcolor, noiseopacity=0.03, parent=none):          """          parameters          ----------          tintcolor: qcolor              rgb 主色调            luminositycolor: qcolor              亮度层颜色            noiseopacity: float              噪声层透明度            parent:              父级窗口          """          super().__init__(parent=parent)          self.tintcolor = qcolor(tintcolor)          self.luminositycolor = qcolor(luminositycolor)          self.noiseopacity = noiseopacity          self.noiseimage = qimage('resource/noise.png')          self.setattribute(qt.wa_translucentbackground)        def settintcolor(self, color: qcolor):          """ 设置主色调 """          self.tintcolor = color          self.update()        def paintevent(self, e):          """ 绘制亚克力纹理 """          acrylictexture = qimage(64, 64, qimage.format_argb32_premultiplied)            # 绘制亮度层          acrylictexture.fill(self.luminositycolor)            # 绘制主色调          painter = qpainter(acrylictexture)          painter.fillrect(acrylictexture.rect(), self.tintcolor)            # 绘制噪声          painter.setopacity(self.noiseopacity)          painter.drawimage(acrylictexture.rect(), self.noiseimage)            acrylicbrush = qbrush(acrylictexture)          painter = qpainter(self)          painter.fillrect(self.rect(), acrylicbrush)  

用到的噪声图像如下图所示:

利用PyQt5中QLabel组件实现亚克力磨砂效果

亚克力标签

最后在 qlabel 上叠加磨砂图像和亚克力纹理,可以通过 image.toqpixmap() 将 image 转换为 qpixmap

class acryliclabel(qlabel):      """ 亚克力标签 """        def __init__(self, blurradius: int, tintcolor: qcolor, luminositycolor=qcolor(255, 255, 255, 0),                   maxblursize: tuple = none, parent=none):          """          parameters          ----------          blurradius: int              磨砂半径            tintcolor: qcolor              主色调            luminositycolor: qcolor              亮度层颜色            maxblursize: tuple              最大磨砂尺寸,越小磨砂速度越快            parent:              父级窗口          """          super().__init__(parent=parent)          self.imagepath = ''          self.blurpixmap = qpixmap()          self.blurradius = blurradius          self.maxblursize = maxblursize          self.acrylictexturelabel = acrylictexturelabel(              tintcolor, luminositycolor, parent=self)        def setimage(self, imagepath: str):          """ 设置图片 """          if imagepath == self.imagepath:              return            self.imagepath = imagepath          image = image.fromarray(gaussianblur(              imagepath, self.blurradius, 0.85, self.maxblursize))          self.blurpixmap = image.toqpixmap()  # type:qpixmap          self.setpixmap(self.blurpixmap)          self.adjustsize()        def settintcolor(self, color: qcolor):          """ 设置主色调 """          self.acrylictexturelabel.settintcolor(color)        def resizeevent(self, e):          super().resizeevent(e)          self.acrylictexturelabel.resize(self.size())          self.setpixmap(self.blurpixmap.scaled(              self.size(), qt.keepaspectratiobyexpanding, qt.smoothtransformation))  

测试

下面是测试用的埃罗芒阿老师:

利用PyQt5中QLabel组件实现亚克力磨砂效果

代码如下:

# coding:utf-8  import sys    from pyqt5.qtgui import qcolor  from pyqt5.qtwidgets import qapplication    from acrylic import acryliclabel      app = qapplication(sys.argv)  w = acryliclabel(20, qcolor(105, 114, 168, 102))  w.setimage('resource/claris_ヒトリゴト (アニメ盤).jpg')  w.show()  app.exec_()  

结果如下:

利用PyQt5中QLabel组件实现亚克力磨砂效果

到此这篇关于利用pyqt5中qlabel组件实现亚克力磨砂效果的文章就介绍到这了,更多相关pyqt5 qlabel磨砂效果内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!

需要了解更多c/c++开发分享利用PyQt5中QLabel组件实现亚克力磨砂效果,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/1074103.html

(0)
上一篇 2022年4月7日
下一篇 2022年4月7日

精彩推荐