我正在尝试将图像的RGB值复制到2D数组。目前,我正在使用两个嵌套的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));
}
最佳答案
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
的调用。这里的权衡是您为图像使用了一些临时内存,这对于较大的图像可能是禁止的。关于java - 在访问图像的像素信息时避免循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29714399/