Korge框架中Bitmap的premultiplied变量有什么作用?
premultiplied 变量含义与作用 
这个标记用来标识当前位图是否使用**预乘透明度(Premultiplied Alpha)**格式存储像素数据,是图形渲染领域非常基础的像素存储配置,具体逻辑和作用如下:
- 核心存储逻辑
普通非预乘格式的ARGB位图四个通道独立存储:A通道存透明度值,R/G/B通道存原始原色值,数值互不干扰。
开启premultiplied的预乘格式下,R/G/B通道存储的数值会提前乘上当前像素的透明度占比:比如一个50%透明度的纯红色像素,非预乘存储值为A=128, R=255, G=0, B=0,预乘后R通道会变为255 * (128/255) ≈ 128,最终存储值为A=128, R=128, G=0, B=0;完全透明(A=0)的像素,预乘后R/G/B值全为0。 - 核心作用
- 提升渲染合成性能
图像半透混合的标准公式为:最终像素 = 源像素颜色 * 源透明度 + 目标位置像素颜色 * (1 - 源透明度)。预乘格式的源像素R/G/B已经提前完成和透明度的乘法计算,GPU合成时可以直接跳过这一步运算,在高分辨率、多层级叠加的渲染场景下性能提升非常明显,这也是Android、iOS等系统默认开启位图预乘的核心原因。 - 避免透明边缘出现杂色色晕
对带透明通道的位图做缩放、模糊、旋转这类需要像素插值的操作时,如果用非预乘格式,透明区域残留的原始RGB值(通常是纯白或纯黑)会被插值算法纳入计算,最终半透边缘会混进不该有的白边/黑边。预乘格式下透明区域的R/G/B值全为0,插值过程不会引入杂色,边缘渲染效果更自然。
- 提升渲染合成性能
- 使用注意事项
用于Canvas、View系统、OpenGL渲染的位图必须保持预乘开启,否则会出现半透区域颜色过饱和、显示异常的问题;只有当你需要做像素级颜色处理(比如抠图、色彩校正、提取原始色值)时,才需要临时关闭预乘,处理完成后如果要用于显示,需要重新转回预乘格式。
内容的提问来源于stack exchange,提问作者xeno
相关产品推荐
相关产品推荐

