You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5中QGraphicsColorizeEffect如何精确影响像素颜色?

QGraphicsColorizeEffect 着色效果的底层算法解析

核心变换规则

QGraphicsColorizeEffect的着色逻辑在HSV色彩空间完成,核心规则如下:

  • 最终像素的**色相(Hue)**直接替换为着色颜色的色相
  • 最终像素的**饱和度(Saturation)和明度(Value)**由原像素与着色颜色的对应分量加权计算得出
  • 计算基于Qt标准HSV范围:Hue为0-359,Saturation和Value为0-255(若使用其他范围需先做转换)

具体计算公式

假设:

  • 原像素HSV:(H₀, S₀, V₀)
  • 着色颜色HSV:(Hₜ, Sₜ, Vₜ)
  • 效果强度参数strength(默认值1.0,范围0.0-1.0,控制着色力度)

饱和度计算

最终饱和度S_final的计算公式为:

S_final = clamp( S₀ × (255 - Sₜ×strength) / 255 + (Sₜ×strength) × V₀ / 255, 0, 255 )

clamp函数用于将结果限制在0-255范围内,避免超出色彩分量的合法区间。

明度计算

最终明度V_final的计算公式为:

V_final = clamp( V₀ + (255 - V₀) × (Vₜ×strength) / 255, 0, 255 )

示例验证(基于默认strength=1.0)

针对你提供的示例,先按Qt标准HSV范围计算逻辑(若结果的S/V是0-100百分比,需做对应转换):

  • 原像素HSV:(246, 134, 168)
  • 着色颜色HSV:(120, 128, 128)
  • strength=1.0

计算过程:

  1. 最终色相H_final = 120
  2. 饱和度:134×(255-128)/255 + 128×168/255 ≈ 66.7 + 84.3 = 151(取整后为151)
  3. 明度:168 + (255-168)×128/255 ≈ 168 + 43.7 = 212(取整后为212)

你给出的结果(120,58,176)与计算值的差异,大概率是HSV范围换算(比如结果用0-100百分比表示)或示例数值笔误导致的。

关键说明

  • 强度参数strength会直接缩放着色颜色的S和V分量,值越小着色效果越弱,原像素特征保留越多
  • Qt源码中使用整数运算(含qRound取整),最终结果会取整到最近的整数

内容的提问来源于stack exchange,提问作者alesparise

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:50:28