2011-04-12 130 views
0

所以,我想要做的是通過一個圖片是1024x768(或,popMap.getWidth x popMap.getHeight),抓住它的藍色,比較它到目前爲止最高的藍色,如果它更多,那藍色變成新的'newBlue'。基本上,找到圖像中最高的藍色值,最接近255藍色。嵌套for循環存儲到一個數組,只有一列嵌套循環到數組

此外,我試圖將整個事情的藍色值存儲到一個數組popMapArray,這是一個3列2d數組,存儲[blueValue] [x] [y]。然後,我將排序,以獲得從高到低的藍色值列表。

我的問題是,用下面的代碼,它只是在列= 767時存儲到數組中。

我得到1024 [藍色,行,767],然後剩下的全是[0,0,0]

任何線索,爲什麼?順便說一句,Java。

for (int row = 0; row < popMap.getWidth(); row++) 
    { 
     for (int column = 0; column < popMap.getHeight(); column++) 
     { 
      System.out.println(column); 
      //Find a Pixel 
      int c = popMap.getRGB(row, column); 
      int red = (c & 0x00ff0000) >> 16; 
      //int green = (c & 0x0000ff00) >> 8; 
      //int blue = c & 0x000000ff; 
      // and the Java Color is ... 
      Color color = new Color(red); 
      int newBlue = color.getBlue(); 
      int oldBlue = lastColor.getBlue(); 
      switch(popArrayRow) 
      { 
       case 0: 
       { 
        arrayVar = newBlue; 
        popArrayRow = 1; 
        break; 
       } 
       case 1: 
       { 
        arrayVar = row; 
        popArrayRow = 2; 
        break; 
       } 
       case 2: 
       { 
        arrayVar = column; 
        popArrayRow = 0; 
        break; 
       } 
      } 
      popArray[row][popArrayColumn] = arrayVar; 
      //System.out.println(popArray[row][popArrayColumn]); 
      switch(popArrayColumn) 
      { 
       case 0: 
       { 
        popArrayColumn = 1; 
        break; 
       } 
       case 1: 
       { 
        popArrayColumn = 2; 
        break; 
       } 
       case 2: 
       { 
        popArrayColumn = 0; 
        break; 
       } 
      } 


      if(newBlue > oldBlue) 
      { 
       startX = row; 
       startY = column; 
       //System.out.print(row); 
       //System.out.print(","); 
       //System.out.println(column); 
       System.out.print("The oldBlue is "); 
       System.out.println(oldBlue); 
       lastColor = color; 
      } 



     } 
    } 
+0

什麼y?我不明白你的問題 – smas 2011-04-12 21:07:44

+0

對不起,當列= 767. – 2011-04-12 21:10:31

回答

0

您沒有顯示聲明去popArray(以及我假設的其他一些變量是已初始化爲0的整數)。您將其描述爲「具有3列的2d陣列」。我猜你已經宣佈它爲int[1024][3],所以它每行有一行popMap,那麼你的3個「列」就是爲了存儲藍色值,原始x座標和原始y座標。

因此,首先不清楚您希望如何在原始圖像中爲每個像素存儲一個條目。但也許我猜你是如何宣佈它是錯誤的。

在任何情況下,通過內循環每次基本上要設置

popArray[currentPixel] = {blueValue, origX, origY}

而是你只三個值中的一個通過循環每次分配。所以,你正在做的事情一樣

popArray[0][0] = blueValue //first iteration; blueValue from row 0 col 0 
popArray[0][1] = 0 //second iteration; row from row 0 col 1 
popArray[0][2] = 2 //third iteration; column from row 0 col 2 

所以希望你也能看到,什麼是錯的,因爲你是填充,都應該從循環的不同迭代值一起去「列」。更糟的是,你然後開始在內部循環的下一次迭代中(其將前row增量迭代共768次)重寫這些值:

popArray[0][0] = blueValue // fourth iteration; blueValue from row 0 col 4; overwrite value assigned on first iteration 
etc... 

而不是使用3陣列「列」具有不同的含義,以掌握這些數據元素,讓一個擁有三個價值觀的班級明確什麼是明智的。 popArray將包含此對象類型。此外,我將它作爲List而不是陣列,因爲它更靈活,最後你可以簡單地調用Collections.sort();或@jsegal有一個很好的建議,即使用插入項目時排序的數據結構。哪一個更好可能取決於你以後想要做什麼。

+0

對於數組的第一部分,它實際上是MAP_HEIGHT * MAP_WIDTH-1,因爲它需要是每個像素。我沒有把所有的代碼放在變量聲明和排序中,因爲這段代碼比這節更多。 隨着'popArray [currentPixel] = {blueValue,origX,origY}',這實際上是我想要做的,我怎麼一次設置三個值到一行?我相信這是完全明顯的,但我最近已經對此產生了興趣。 – 2011-04-12 21:38:19

+0

固定:現在簡單: \t \t \t \t popArray [currentRow] [0] = newBlue; \t \t \t \t popArray [currentRow] [1] = row; \t \t \t \t popArray [currentRow] [2] = column; \t \t \t \t currentRow ++; \t \t \t \t如果(currentRow> =(BOX_WIDTH * BOX_HEIGHT-1)) \t \t \t \t { \t \t \t \t \t中斷; \t \t \t \t} 設置每個行只有一次,將它們全部保存,並給我一個充滿每一個點的數組,它的顏色,x和y。感謝您指出我是如何徹底失敗的二維數組,現在變得更有意義! – 2011-04-12 22:05:18

1
int red = (c & 0x00ff0000) >> 16; 
     //int green = (c & 0x0000ff00) >> 8; 
     //int blue = c & 0x000000ff; 
     // and the Java Color is ... 
     Color color = new Color(red); 
     int newBlue = color.getBlue(); 

你的意思是 「Colour彩色=新的色彩(C)」?您的newBlue值將始終爲0 ...

另外,您準備用popArray構造做什麼?讓每個像素的狀態變量自己調整一次可能不會達到您想要的效果......聽起來您想要一個SortedMap<int,Point>,鍵入blueValue,其值是點的x,y座標(作爲數組或Point對象)。然後你會得到你的數據結構,按藍色值排序,你可以直接閱讀你的點數。

祝你好運!

+0

那麼現在它是灰度,所以藍色或紅色並不重要,它出來是一樣的。它會保持灰色,我只是隨意選擇藍色,因爲爲什麼不。 我會看看SortedMap,我知道必須做些什麼才能做我想做的事情。 – 2011-04-12 21:17:37

+0

這似乎是做到這一點的最佳方式,只需要幾行就能做到我想要的大部分。只需要弄清楚如何訪問SortedMap,因爲我之前從未使用過。 – 2011-04-12 21:54:52