2015-04-18 45 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电话。在这里进行折衷是因为您使用了一些临时内存来存放图像,这对于较大的图像来说可能是禁止的。