脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - 利用PyQt5中QLabel组件实现亚克力磨砂效果

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

2022-11-14 09:25之一Yo Python

Windows10 在 UWP 应用中支持亚克力画刷,可以在部件的底部绘制亚克力效果的背景图。本文将使用QLabel来模拟这个磨砂过程,感兴趣的可以了解一下

前言

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磨砂效果内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/zhiyiYo/p/15768440.html

延伸 · 阅读

精彩推荐
  • Pythonmatplotlib部件之套索Lasso的使用

    matplotlib部件之套索Lasso的使用

    这篇文章主要介绍了matplotlib部件之套索Lasso的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下...

    mighty138352021-09-09
  • Python浅谈如何使用Python控制手机(一)

    浅谈如何使用Python控制手机(一)

    这篇文章主要为大家介绍了如何使用Python控制手机,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助...

    苏苏与阿言5932022-03-02
  • PythonopenCV提取图像中的矩形区域

    openCV提取图像中的矩形区域

    这篇文章主要为大家详细介绍了openCV提取图像中的矩形区域,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    c1996122744322020-07-21
  • Pythonpython实现人人自动回复、抢沙发功能

    python实现人人自动回复、抢沙发功能

    这篇文章主要为大家详细介绍了python实现人人自动回复、抢沙发功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    longshen7477242021-03-02
  • PythonPython3.4学习笔记之 idle 清屏扩展插件用法分析

    Python3.4学习笔记之 idle 清屏扩展插件用法分析

    这篇文章主要介绍了Python3.4 idle 清屏扩展插件用法,简单分析了idle清屏的几种方法及idle清屏插件的相关使用技巧,需要的朋友可以参考下...

    流风,飘然的风4692021-06-03
  • Python使用Python-OpenCV消除图像中孤立的小区域操作

    使用Python-OpenCV消除图像中孤立的小区域操作

    这篇文章主要介绍了使用Python-OpenCV消除图像中孤立的小区域操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 ...

    xiaoxifei11772020-07-05
  • PythonDjango实现微信小程序的登录验证功能并维护登录态

    Django实现微信小程序的登录验证功能并维护登录态

    这篇文章主要介绍了Django实现小程序的登录验证功能并维护登录态,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参...

    门牙4562021-08-01
  • PythonPython 中创建 PostgreSQL 数据库连接池

    Python 中创建 PostgreSQL 数据库连接池

    这篇文章主要介绍了Python 中创建 PostgreSQL 数据库连接池,Python 连接 PostgreSQL 是主要有两个包, py-postgresql 和 psycopg2 , 而本文的实例将使用后者,感兴趣的...

    Yanbin Blog6982022-01-25