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

10-12 14:58
查看更多