在访问图像的像素信息时避免循环

时间:2015-04-18 07:35:02

标签: java arrays for-loop arraycopy

我正在尝试将图像的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));
}

1 个答案:

答案 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。这里的权衡是你为图像使用一些临时存储器,这对于较大的图像可能是禁止的。