当前位置:  开发笔记 > IOS > 正文

理论上讲:如何将alpha组件预先复制到iPhone OS中的PNG的其他组件中,以及如何正确地将其解复用?

如何解决《理论上讲:如何将alpha组件预先复制到iPhoneOS中的PNG的其他组件中,以及如何正确地将其解复用?》经验,为你挑选了2个好方法。

实际上,我认为有一种简单的方法可以实现这一目标.我需要的是纯alpha值信息.为了测试,我有一个50 x 55 px的PNG,在每个边缘,一个5x5像素的矩形是完全透明的.在这些领域中的α必须是0.Everywhere否则它必须是255我做了非常肯定我的PNG正确创建的,它看起来也正常.

请告诉我这是否在理论上是正确的:我创建了一个只有alpha通道的CGImageRef,没有别的.这是通过CGBitmapContextCreate和kCGImageAlphaOnly作为参数完成的.CGBitmapContextGetBitsPerPixel(context)返回1,因此它表明我每个像素只有一个组件:所需的alpha值.我一直在读CGBitmapContextCreate将处理从给定图像到新创建的上下文的所有转换.我的图像之前是带有透明度的PNG-24,但是来自Xcode的pngcrunch似乎以某种方式转换它们.

所以,理论上说:此时我是否有机会获得正确的,无法预测的alpha?我得到的值似乎几乎匹配,但在一个大的5x5透明方块中,我得到的值如19,197,210,0,0,0,98等等.如果它们是真的,我将不得不从图像中看到一些东西.图像本身是纯蓝色.



1> Peter Hosey..:

预乘不影响alpha通道,它会影响颜色通道.

栅格合成的公式(将一个栅格图像放在另一个上)是:

dst.r = src.r * src.a + dst.r * (1.0 - src.a);
dst.g = src.g * src.a + dst.g * (1.0 - src.a);
dst.b = src.b * src.a + dst.b * (1.0 - src.a);

预乘会削减第一个乘法表达式:

dst.r = src.r? + dst.r * (1.0 - src.a);
dst.g = src.g? + dst.g * (1.0 - src.a);
dst.b = src.b? + dst.b * (1.0 - src.a);

这是因为源颜色分量已经乘以alpha分量 - 因此名称"预乘".现在不需要将它们相乘,因为它已经有了结果.

未经加倍的alpha

alpha组件本身永远不会被预乘:你会把它乘以什么?的颜色分量预乘由所述α.



2> rpetrich..:

由于预乘颜色值很简单,因为:

r = (r * a) / 255;
g = (g * a) / 255;
b = (b * a) / 255;

反过来会是:

if (a > 0) {
    r = (r * 255) / a;
    g = (g * 255) / a;
    b = (b * 255) / a;
}

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有