Iphone 正在寻找使用预乘alpha的帮助
我正在尝试用多个目标图像的内容更新源图像。从我可以看出,使用预乘alpha是解决这个问题的方法,但我认为我做错了什么(下面的函数)。我开始使用的映像已初始化,所有ARGB值均设置为0。当我运行该函数时,结果图像看起来很棒,但当我开始在任何其他图像上合成时,所有包含alpha信息的像素都会变得非常混乱。有人知道我是否做了一些明显错误的事情,或者我需要做一些额外的事情来修改颜色值吗Iphone 正在寻找使用预乘alpha的帮助,iphone,c,objective-c,Iphone,C,Objective C,我正在尝试用多个目标图像的内容更新源图像。从我可以看出,使用预乘alpha是解决这个问题的方法,但我认为我做错了什么(下面的函数)。我开始使用的映像已初始化,所有ARGB值均设置为0。当我运行该函数时,结果图像看起来很棒,但当我开始在任何其他图像上合成时,所有包含alpha信息的像素都会变得非常混乱。有人知道我是否做了一些明显错误的事情,或者我需要做一些额外的事情来修改颜色值吗 void CompositeImage(unsigned char *src, unsigned char *dest
void CompositeImage(unsigned char *src, unsigned char *dest, int srcW, int srcH){
int w = srcW;
int h = srcH;
int px0;
int px1;
int px2;
int px3;
int inverseAlpha;
int r;
int g;
int b;
int a;
int y;
int x;
for (y = 0; y < h; y++) {
for (x= 0; x< w*4; x+=4) {
// pixel number
px0 = (y*w*4) + x;
px1 = (y*w*4) + (x+1);
px2 = (y*w*4) + (x+2);
px3 = (y*w*4) + (x+3);
inverseAlpha = 1 - src[px3];
// create new values
r = src[px0] + inverseAlpha * dest[px0];
g = src[px1] + inverseAlpha * dest[px1];
b = src[px2] + inverseAlpha * dest[px2];
a = src[px3] + inverseAlpha * dest[px3];
// update destination image
dest[px0] = r;
dest[px1] = g;
dest[px2] = b;
dest[px3] = a;
}
}
void CompositeImage(无符号字符*src,无符号字符*dest,int-srcW,int-srcH){
int w=srcW;
int h=srcH;
int-px0;
int-px1;
int-px2;
int-px3;
内翻内翻;
INTR;
int g;
int b;
INTA;
int-y;
int x;
对于(y=0;y
}我不清楚您使用的是什么数据。您的源图像在存储时是否已经预先乘以了alpha值?如果不是,那么预乘的alpha在这里不适用,您需要进行正常的alpha混合 无论如何,代码中的一个大问题是没有跟踪所处理的值范围
inverseAlpha = 1 - src[px3];
这需要更改为:
inverseAlpha = 255 - src[px3];
这里有所有整数值类型,因此正常输入的0..255值范围将导致inverseAlpha范围-254..1,这将给您一些真正古怪的结果
将1更改为255后,还需要将每个通道的结果除以255,以将其缩小到适当的范围。另一种方法是使用浮点而不是整数进行中间计算,并将初始通道值除以255.0(而不是这些其他更改),以获得0..1范围内的值
如果源数据确实已经预乘了alpha,那么结果行应该是这样的
r = src[px0] + inverseAlpha * dest[px0] / 255;
如果源数据没有预乘alpha,则应为:
r = src[px0] * src[px3] / 255 + inverseAlpha * dest[px0] / 255;
混合alpha通道没有什么特别的。使用与r、g和b相同的计算方法。这一计算方法非常有效。我之前已经分别尝试过这两种方法,但没有想到将它们插在一起。现在有道理了。