2015-04-18 85 views
1

我試圖將圖像的RGB值複製到二維數組。目前我正在使用兩個嵌套for循環。我的問題是,是否可以使用arraycopy或其他任何方法使操作更快?訪問圖像的像素信息時避免循環

下面的代碼工作正常,我只想優化它。

private LSHColor[][] pixels = new LSHColor[w][h]; 
public LSHImage(BufferedImage img) { 
    pixels = new LSHColor[img.getWidth()][img.getHeight()]; 
    for (int y = 0; y < img.getHeight(); y++) 
     for (int x = 0; x < img.getWidth(); x++) 
      pixels[x][y] = LSHColor.fromRGB(img.getRGB(x, y)); 
} 

回答

1

arraycopy有兩個原因沒有幫助。第一個原因是你沒有製作副本:你正在創建一個基於另一個數組的內容的數組。最重要的是,你的pixels[][]是列主要的順序,這意味着同一列的像素在內存中彼此相鄰,而圖像按行優先順序存儲。

您可以優化的一件事是從圖像中獲取像素。而不是讀他們每次一個,你可以立刻讓他們所有,然後用你的循環處理,就像這樣:

public LSHImage(BufferedImage img) { 
    int w = img.getWidth(); 
    int h = img.getHeight(); 
    pixels = new LSHColor[w][h]; 
    int[] raw = img.getRGB(0, 0, w, h, null, 0, w); 
    for (int y = 0; y < img.getHeight(); y++) 
     for (int x = 0; x < img.getWidth(); x++) 
      pixels[x][y] = LSHColor.fromRGB(raw[w*y+x]); 
} 

這使得一個調用getRGB而不是使Width*Height電話。在這裏進行折衷是因爲您使用了一些臨時內存來存放圖像,這對於較大的圖像來說可能是禁止的。