2012-02-10 80 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 
         } 
        } 
       } 

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