源碼
fn premultiply(self) -> Argb {//預乘// This could be optimized by using SWARlet a = self.alpha32();if a < 255 {Argb::new32(a, div255(self.red32() * a), div255(self.green32() * a),div255(self.blue32() * a))}else{self}
源碼分析
這個函數實現了顏色預乘(premultiply)操作,主要用于圖像處理中的alpha合成。
功能
-
將ARGB顏色值的RGB通道乘以alpha通道值(即預乘alpha)
-
如果alpha已經是255(完全不透明),則直接返回原值
代碼解析
fn premultiply(self) -> Argb {let a = self.alpha32(); // 獲取alpha通道值(0-255)if a < 255 { // 只有alpha不是255時才需要處理Argb::new32(a, // alpha保持不變div255(self.red32() * a), // 紅色通道乘以alphadiv255(self.green32() * a), // 綠色通道乘以alphadiv255(self.blue32() * a) // 藍色通道乘以alpha)} else {self // alpha=255時直接返回原值}
}
關鍵點
-
div255(x) 是一個快速除以255的優化函數,因為 (x * a) / 255 是預乘的標準公式
-
當alpha=255時,預乘不會改變顏色值,所以直接返回原值可以節省計算
-
如果使用SWAR(SIMD Within A Register)技術可以進一步優化
預乘的作用
預乘alpha的主要用途是:
-
使后續的合成操作更高效
-
避免顏色滲漏到透明區域
-
是許多圖像合成算法(如over操作)的基礎
這種預乘后的顏色格式稱為"premultiplied alpha",廣泛應用于圖形渲染和圖像處理中。