Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 正在寻找使用预乘alpha的帮助_Iphone_C_Objective C - Fatal编程技术网

Iphone 正在寻找使用预乘alpha的帮助

Iphone 正在寻找使用预乘alpha的帮助,iphone,c,objective-c,Iphone,C,Objective C,我正在尝试用多个目标图像的内容更新源图像。从我可以看出,使用预乘alpha是解决这个问题的方法,但我认为我做错了什么(下面的函数)。我开始使用的映像已初始化,所有ARGB值均设置为0。当我运行该函数时,结果图像看起来很棒,但当我开始在任何其他图像上合成时,所有包含alpha信息的像素都会变得非常混乱。有人知道我是否做了一些明显错误的事情,或者我需要做一些额外的事情来修改颜色值吗 void CompositeImage(unsigned char *src, unsigned char *dest

我正在尝试用多个目标图像的内容更新源图像。从我可以看出,使用预乘alpha是解决这个问题的方法,但我认为我做错了什么(下面的函数)。我开始使用的映像已初始化,所有ARGB值均设置为0。当我运行该函数时,结果图像看起来很棒,但当我开始在任何其他图像上合成时,所有包含alpha信息的像素都会变得非常混乱。有人知道我是否做了一些明显错误的事情,或者我需要做一些额外的事情来修改颜色值吗

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相同的计算方法。

这一计算方法非常有效。我之前已经分别尝试过这两种方法,但没有想到将它们插在一起。现在有道理了。