2012-02-10 50 views
1

我知道他们已经有一些“优化循环”的问题,但我认为这是一个有点不同。优化颜色范围检查嵌套for循环

我得到一个代码,读取图像中的所有像素。 从每个像素我必须有RGB颜色,这也已经工作。 然后,我必须检查绿色是否大于红色的蓝色,这也可以。 当绿色比红色和蓝色更大时,它必须做点什么。 这一切都有效,但目前真的很慢。

我也知道为什么它是缓慢的,因为它有做检查的数以百万计的嵌套循环, 这是我的代码:

for (int j = 0; j < 200; j++){ 
      for (int k = 0; k < 200; k++){ 
       Log.i("Pixel Value", "pixel x="+j +k + Integer.toHexString(bmp.getPixel(j, k))); 

        for (cGreen = 50; cGreen < 254; cGreen++){ 
         for (cRed = 0; cRed < 254; cRed++){ 
          for (cBlue = 0; cBlue < 254; cBlue++){ 

           if (Color.rgb(cRed, cGreen, cBlue) == bmp.getPixel(j, k)){ // magic method 
            if ((cGreen > cRed)&&(cGreen > cBlue)){ 
             // this pixel is some sort of green 
             aantal++; 
            } 
           } 
          } 
         } 
        } 
      } 
     } 

第j &ķ变量是图像的大小。 和“aantal”是一个荷兰语单词,它的英文意思是“数量”。

他们的方法是让代码更快(对于程序)? 我尝试了很多东西,但效果并不好。

我也尝试已经做了检查类似:

if (cGreen < cRed){ 
    // skip the rest 
} 

所以,当名气已经高于cGreen他可以跳过休息。然后它会更快,但是速度不够快。

那么,他们是一个“聪明”的方式来使代码更快运行? 或其他类型的颜色检查快很多,或者其他类型的“过滤器”。 希望你们能想到一些东西。

谢谢!

编辑: 我做了另一个跳过检查,程序现在需要4秒检查每个像素,而不是6,但它必须是几个像素,在1秒内。

+0

我已经修好了,但是我不能发表我自己的回答,我的代表不够高,但我会保持现状! – Bigflow 2012-02-10 13:43:01

回答

1

我发现了一个修复程序,但是代码是一个完全改变。

bmp = BitmapFactory.decodeResource(getResources(), 
       R.drawable.four_colors); 
     System.out.println("START"); 
     int orgWidth = bmp.getWidth(); 
     int orgHeight = bmp.getHeight(); 
     //define the array size 
     int[] pixels = new int[orgWidth * orgHeight]; 

       bmp.getPixels(pixels, 0, orgWidth, 0, 0, orgWidth, orgHeight); 

       for (int y = 0; y < orgHeight; y++){ 
        for (int x = 0; x < orgWidth; x++){ 
         int index = y * orgWidth + x; 
         int R = (pixels[index] >> 16) & 0xff;  //bitwise shifting 
         int G = (pixels[index] >> 8) & 0xff; 
         int B = pixels[index] & 0xff; 
         total++; 
         if ((G > R)&&(G > B)){ 
          counter++; 
          // do something 
         } 
        } 
       } 

我希望它也能帮助其他人。