2011-07-27 42 views
0

我有两个像素的流,基本上需要做一个自定义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... 
+0

你平时的流程有多长? – Cyprian

+0

没有所有if ... else ...部件有多快? – Eiko

+0

另一个问题:Pic1中可能存在颜色匹配的可能性以及Pic2可能性如何?你检查的颜色是否有共同之处? – Eiko

回答

1

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

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; 
} ... 

像这样的优化加快了我的测试程序36.5%,只有5个测试用例。

1

不要自己走像素缓冲区,它会很痛苦地慢。在CoreImage中使用自定义过滤器来做这种事情。

+0

你有这样的代码示例吗?我很早就做了一些重要的搜索,因为我完全同意你的看法!这将是最好的解决方案。我很难找到一种过滤方法,可以让我提取某些颜色或掩盖某些颜色.... – capikaw