Iphone 更快的像素计数

Iphone 更快的像素计数,iphone,objective-c,pixels,Iphone,Objective C,Pixels,我有两个像素流,基本上需要对它们进行自定义xor,以生成最终的图片。它工作得很好-唯一的问题是模拟器需要4秒钟来解析代码。我知道必须有一种方法来优化这个程序——但在几天的试验之后,我的想法(没有用),我求助于一些帮助 这是我的代码-提前感谢您的建议 //rawPic1Data and rawPic2Data is a stream of unsigned chars that ultimately came from a UIImage

我有两个像素流,基本上需要对它们进行自定义xor,以生成最终的图片。它工作得很好-唯一的问题是模拟器需要4秒钟来解析代码。我知道必须有一种方法来优化这个程序——但在几天的试验之后,我的想法(没有用),我求助于一些帮助

这是我的代码-提前感谢您的建议

             //rawPic1Data and rawPic2Data is a stream of unsigned chars that ultimately came from a UIImage

                for (int i = 0 ; i < (bufferLength); i=i+4)
                {

                    sred = (int)(rawPic1Data[i + 0]);
                    sgreen = (int)(rawPic1Data[i + 1]);
                    sblue = (int)(rawPic1Data[i + 2]);

                    rred = (int)(rawPic2Data[i + 0]);
                    rgreen = (int)(rawPic2Data[i + 1]);
                    rblue = (int)(rawPic2Data[i + 2]);

                    fred = 0;
                    fgreen = 0;
                    fblue = 0;
                    falpha = 0;

                    if (((sred == 102) && (sgreen == 0) && (sblue == 153)) || ((rred == 102) && (rgreen == 0) && (rblue == 153)))
                    {
                        fred = 102; fgreen = 0; fblue = 153; falpha = 255;
                    }
                    else if (((sred == 153) && (sgreen == 51) && (sblue == 204)) || ((rred == 153) && (rgreen == 51) && (rblue == 204)))
                    {
                        fred = 153; fgreen = 51; fblue = 204; falpha = 255;
                    }

                     //...repeat the elseifs for another 12 colors.  (14 total)
                }

            //Use the f values for my final output... 
//rawPic1Data和rawPic2Data是最终来自UIImage的未签名字符流
对于(int i=0;i<(bufferLength);i=i+4)
{
sred=(int)(rawPic1Data[i+0]);
sgreen=(int)(rawPic1Data[i+1]);
sblue=(int)(rawPic1Data[i+2]);
rred=(int)(rawPic2Data[i+0]);
rgreen=(int)(rawPic2Data[i+1]);
rblue=(int)(rawPic2Data[i+2]);
fred=0;
fgreen=0;
fblue=0;
falpha=0;
如果((sred==102)&&(sgreen==0)&&&(sblue==153))| |((rred==102)&&(rgreen==0)&&(rblue==153)))
{
fred=102;fgreen=0;fblue=153;falpha=255;
}
如果((sred==153)&&(sgreen==51)&&(sblue==204))| |((rred==153)&&&(rgreen==51)&&(rblue==204)))
{
fred=153;fgreen=51;fblue=204;falpha=255;
}
//…对另外12种颜色重复其他颜色。(共14种)
}
//使用f值作为最终输出。。。

不要自己走像素缓冲区,它会非常慢。使用CoreImage中的自定义过滤器执行此类操作。

您可以做的一件事是将每个流中的三个值组合成一个更大的变量。这将允许您一次对所有三个进行比较,因此代码中的比较数量将是原来的三分之一

sred = (int)(rawPic1Data[i + 0]);
sgreen = (int)(rawPic1Data[i + 1]);
sblue = (int)(rawPic1Data[i + 2]);
register unsigned sval = (sred << 16) | (sgreen << 8) | (sblue);

rred = (int)(rawPic2Data[i + 0]);
rgreen = (int)(rawPic2Data[i + 1]);
rblue = (int)(rawPic2Data[i + 2]);
register unsigned rval = (rred << 16) | (rgreen << 8) | (rblue);

fred = 0;
fgreen = 0;
fblue = 0;
falpha = 0;

if(sval == ((102<<16)|(153) || rval == ((102<<16)|(153)) {
    fred = 102; fgreen = 0; fblue = 153; falpha = 255;
} else if(sval == ((153<<16)|(51<<8)|(204))) || rval = ((153<<16)|(51<<8)|(204)))) {
    fred = 153; fgreen = 51; fblue = 204; falpha = 255;
} ...
sred=(int)(rawPic1Data[i+0]);
sgreen=(int)(rawPic1Data[i+1]);
sblue=(int)(rawPic1Data[i+2]);

寄存器无符号sval=(sred您通常的流有多长?如果没有所有的if…else…部分,流的速度有多快?另外两个问题:Pic1中颜色匹配的可能性有多大,Pic2中颜色匹配的可能性有多大?您检查的颜色是否有共同点?您有这方面的代码示例吗?我在早期做了一些主要的搜索,因为我完全同意您的观点!这是w这将是最好的解决方案。我很难找到一种过滤方法,使我能够提取某些颜色或遮罩某些颜色。。。。