前言
windows10 在 uwp 应用中支持亚克力画刷,可以在部件的底部绘制亚克力效果的背景图。下面我们使用 qlabel 来模拟这个磨砂过程。
实现方法
msdn 文档中介绍了亚克力材料的配方,包括:高斯模糊、亮度混合、色调混合和噪声纹理。
高斯模糊
我们先来实现高斯模糊的效果,使用 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)
用到的噪声图像如下图所示:
亚克力标签
最后在 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))
测试
下面是测试用的埃罗芒阿老师:
代码如下:
# 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磨砂效果内容请搜索<计算机技术网(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