# 验证轮盘中心文本居中:标题像素包围盒应关于画布中心 (268,268) 对称,且状态间完全一致 $ErrorActionPreference = 'Stop' Add-Type -AssemblyName System.Drawing function Measure-Hub($path, [string]$mode) { $bmp = [System.Drawing.Bitmap]::FromFile((Resolve-Path $path)) $cx = 268; $cy = 268; $hubR = 54 $darkN = 0; $darkX = 0.0; $darkY = 0.0 $darkMinX = 9999; $darkMaxX = -1; $darkMinY = 9999; $darkMaxY = -1 $grayN = 0; $grayX = 0.0; $grayY = 0.0 for ($y = $cy - $hubR; $y -le $cy + $hubR; $y++) { for ($x = $cx - $hubR; $x -le $cx + $hubR; $x++) { $dx = $x - $cx; $dy = $y - $cy if ($dx * $dx + $dy * $dy -gt $hubR * $hubR) { continue } $px = $bmp.GetPixel($x, $y) if ($px.A -lt 200) { continue } $sum = $px.R + $px.G + $px.B if ($mode -eq 'light') { if ($sum -lt 330) { $darkN++; $darkX += $x; $darkY += $y if ($x -lt $darkMinX) { $darkMinX = $x }; if ($x -gt $darkMaxX) { $darkMaxX = $x } if ($y -lt $darkMinY) { $darkMinY = $y }; if ($y -gt $darkMaxY) { $darkMaxY = $y } } elseif ($sum -ge 300 -and $sum -le 420) { $grayN++; $grayX += $x; $grayY += $y } } else { if ($sum -gt 560) { $darkN++; $darkX += $x; $darkY += $y if ($x -lt $darkMinX) { $darkMinX = $x }; if ($x -gt $darkMaxX) { $darkMaxX = $x } if ($y -lt $darkMinY) { $darkMinY = $y }; if ($y -gt $darkMaxY) { $darkMaxY = $y } } elseif ($sum -ge 430 -and $sum -le 560) { $grayN++; $grayX += $x; $grayY += $y } } } } $bmp.Dispose() $bboxCX = if ($darkN -gt 0) { ($darkMinX + $darkMaxX) / 2.0 } else { -1 } Write-Output (" TitlePixelCount={0} BboxX=[{1},{2}] BboxCenterX={3} (期望268) BboxY=[{4},{5}]" -f $darkN, $darkMinX, $darkMaxX, [Math]::Round($bboxCX, 2), $darkMinY, $darkMaxY) Write-Output (" HintPixelCount={0} HintCenterX={1} (供参考)" -f $grayN, $(if ($grayN -gt 0) { [Math]::Round($grayX / $grayN, 2) } else { -1 })) } foreach ($file in 'wheel-light.png', 'wheel-light-hover.png') { Write-Output "=== $file ===" Measure-Hub "artifacts\$file" 'light' } foreach ($file in 'wheel-dark.png', 'wheel-dark-hover.png') { Write-Output "=== $file ===" Measure-Hub "artifacts\$file" 'dark' }