在 Swift 開發中,常使用 UInt32 單一變量儲存 RGBA 顏色值(每個通道 8 位),而拆解時則對應四個 UInt8 變量分別代表 R、G、B、A。當需要將某像素點「變亮」(例如將 R、G、B 分量乘以 2)時,數值極易超出 UInt8 的 0–255 範圍,導致溢出錯誤或顏色錯誤。
關鍵原則:所有 RGB 分量必須限制在 0–255 區間內。 計算完成後,需對結果進行飽和處理或取模運算,確保不超出邊界。
func brighten(color: UInt32) -> UInt32 {
let r = UInt8(min(255, Int((color >> 24) & 0xFF) * 2))
let g = UInt8(min(255, Int((color >> 16) & 0xFF) * 2))
let b = UInt8(min(255, Int((color >> 8) & 0xFF) * 2))
let a = UInt8(color & 0xFF)
return (UInt32(r) << 24) | (UInt32(g) << 16) | (UInt32(b) << 8) | UInt32(a)
}
clamped(to:)(Swift 5.0+)let newR = (Int(r) * 2).clamped(to: 0...255)
let newG = (Int(g) * 2).clamped(to: 0...255)
let newB = (Int(b) * 2).clamped(to: 0...255)
// 利用 0xFF 掩碼與移位,避免分支預測失敗
let saturated = { (val: UInt8) -> UInt8 in
let doubled = Int(val) * 2
return UInt8(doubled > 255 ? 255 : doubled)
}
Color 結構體,內部處理轉換邏輯。掌握這些技巧,即可在 Swift 中安全、高效地進行像素級顏色運算,避免數據溢出帶來的難以排查的 Bug。