我正在尝试将图像的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));
}
答案 0 :(得分: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
。这里的权衡是你为图像使用一些临时存储器,这对于较大的图像可能是禁止的。