如何将带Alpha通道的8位Hex颜色转换为适配白色背景的6位Hex颜色
8位带透明度Hex转白色背景下的6位Hex(扁平化)
核心算法原理
8位Hex格式为 #RRGGBBAA,其中:
RR/GG/BB:前景色的红/绿/蓝通道(十六进制00-FF,对应十进制0-255)AA:透明度通道(十六进制00=完全透明,FF=完全不透明,对应十进制0-255)
假设背景为纯白色(RGB=(255,255,255)),最终扁平化后的每个RGB通道值计算公式为:
最终通道值 = 前景通道值 * (Alpha / 255) + 255 * (1 - Alpha / 255)
计算后对结果四舍五入取整,再转换为两位十六进制字符串,拼接成标准6位Hex颜色(格式#RRGGBB)。
示例颜色转换结果
以下是你提供的颜色经过计算后的扁平化结果:
- 原颜色
#14C4C1FD→ 扁平化后#16C4C1 - 原颜色
#F25021F4→ 扁平化后#F3582B - 原颜色
#FE7162FD→ 扁平化后#FE7263 - 原颜色
#A259FFFD→ 扁平化后#A35AFF - 原颜色
#6A9A9C60→ 扁平化后#DCE7E8 - 原颜色
#28B8ABBB→ 扁平化后#61CBC1 - 原颜色
#5B9CB931→ 扁平化后#DFECF2
PowerShell 实现脚本
function Convert-8BitHexToFlat6Bit { param( [Parameter(Mandatory=$true)] [string[]]$HexColors ) foreach ($hex in $HexColors) { # 去除#号并统一转为大写 $cleanHex = $hex.TrimStart('#').ToUpper() if ($cleanHex.Length -ne 8) { Write-Warning "无效的8位Hex颜色:$hex" continue } # 拆分各通道为十进制值 $r = [Convert]::ToInt32($cleanHex.Substring(0,2), 16) $g = [Convert]::ToInt32($cleanHex.Substring(2,2), 16) $b = [Convert]::ToInt32($cleanHex.Substring(4,2), 16) $alpha = [Convert]::ToInt32($cleanHex.Substring(6,2), 16) # 计算扁平化后的RGB值 $alphaRatio = $alpha / 255.0 $flatR = [Math]::Round($r * $alphaRatio + 255 * (1 - $alphaRatio)) $flatG = [Math]::Round($g * $alphaRatio + 255 * (1 - $alphaRatio)) $flatB = [Math]::Round($b * $alphaRatio + 255 * (1 - $alphaRatio)) # 确保值在0-255的合法范围内 $flatR = [Math]::Clamp($flatR, 0, 255) $flatG = [Math]::Clamp($flatG, 0, 255) $flatB = [Math]::Clamp($flatB, 0, 255) # 转换为两位十六进制并拼接成最终颜色 $flatHex = "#$($flatR.ToString('X2'))$($flatG.ToString('X2'))$($flatB.ToString('X2'))" # 输出结果 [PSCustomObject]@{ Original = $hex Flat6BitHex = $flatHex } } } # 测试示例颜色 $sampleColors = @( "#14C4C1FD", "#F25021F4", "#FE7162FD", "#A259FFFD", "#6A9A9C60", "#28B8ABBB", "#5B9CB931" ) Convert-8BitHexToFlat6Bit -HexColors $sampleColors
脚本说明
- 函数
Convert-8BitHexToFlat6Bit支持批量转换多个8位Hex颜色 - 自动验证输入格式,对无效颜色抛出警告
- 通过数学公式计算白色背景下的扁平化颜色,四舍五入保证视觉准确性
- 内置值范围限制,避免出现超出0-255的非法RGB值
内容的提问来源于stack exchange,提问作者fmotion1
相关产品推荐
相关产品推荐

