问个alpha混合公式问题,
本帖最后由 weiwuyuan 于 2013-06-09 17:40:08 编辑 一般的混合都是针对底色为完全不透明的情况,假如底色不完全透明呢? 该怎么混合?
比如:
底色=0x00000000
上色=0xB25A5A5A
混合结果=0xB25A5A5A
那么如果用公式:above_X*above_A/255 + below_X*(255-above_A)/255 (其中X代表R或G或B)
其结果将是错误的,
对于底色为不完全透明的情况,我一直是用这样的公式:
above_X*above_A/255 + below_X*below_A/255
经测试,其混合效果也看不出有何不对.只是,上面那个例子,带进去算一下,结果并不是0xB25A5A5A
应该用什么公式?
[解决办法]
不是很明白你的问题啊
是想底色=0x000000的时候有特殊效果,还是想要 完全不透明呢。
如果需要完全不透明
above_X*above_A/255 + below_X*(255-above_A)/255
公式中 above_A 取值为255 就可以了吧。
[解决办法]
假设:RGB和不透明度通道都是8位。
层数从下住上走:
已合成的像素值 * (255-当前层的透明通道值) / 255 + 当前层像素值 * (当前层的透明通道值)/ 255
还有一个从上层往下走的方法:要复杂一些,但可能速度更快。要另加一个与图像尺寸相同的空间:aED(,):
如果 aED(,)== 255 则跳过当前像素。
否则:
....申明 intA = 255-aED(,)//这是可以允许的最大显示程度
....申明 intB = 当前通道的不透明通道值
....申明 intC = intB;
....如果 intA > intB
....{//当前显示程度大于允许显示的程度,强制收缩到允许显示的程度
........ intC = intA;
....}
....当前输出值 += 当前通道值 * intC / 255;
....aED(,) += intC;
另加一个哨兵,判断如果整个画面的aED(,)== 255,则可以直接跳出。