需要更快的方法来获取缓冲图像的每个像素的RGB值

Jon*_*ony 7 java image-processing pixels

获取每个像素的RGB值的最快方法是BufferedImage什么?

现在我使用两个for循环获取RGB值,如下面的代码所示,但是由于嵌套循环运行总共479999次,因此获取这些值花费的时间太长.如果我使用16位图像,这个数字会更高!

我需要一种更快的方法来获取像素值.

这是我目前正在尝试使用的代码:

BufferedImage bi=ImageIO.read(new File("C:\\images\\Sunset.jpg"));

int countloop=0;  

for (int x = 0; x <bi.getWidth(); x++) {
    for (int y = 0; y < bi.getHeight(); y++) {
        Color c = new Color(bi.getRGB(x, y));
        System.out.println("red=="+c.getRed()+" green=="+c.getGreen()+"    blue=="+c.getBlue()+"  countloop="+countloop++);                                                                                                                                                  
    }
}
Run Code Online (Sandbox Code Playgroud)

mas*_*taH 14

我不知道这是否有用,我还没有测试过,但你可以这样得到rgb值:

BufferedImage bi=ImageIO.read(new File("C:\\images\\Sunset.jpg"));
int[] pixel;

for (int y = 0; y < bi.getHeight(); y++) {
    for (int x = 0; x < bi.getWidth(); x++) {
        pixel = bi.getRaster().getPixel(x, y, new int[3]);
        System.out.println(pixel[0] + " - " + pixel[1] + " - " + pixel[2] + " - " + (bi.getWidth() * y + x));
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,您不必在循环内初始化新的Color.我也按照onemasse的建议反转宽度/高度循环,以从我已有的数据中检索计数器.


Fre*_*d F 5

通过从一堆单独的getRGB更改为一个大的getRGB来将整个图像复制到一个数组中,执行时间从33,000毫秒下降到3,200毫秒,而创建阵列的时间仅为31毫秒.

毫无疑问,对数组进行大量读取并对数组进行直接索引要比许多单独读取快得多.

性能差异似乎与在类末尾使用断点语句有关.当断点位于循环之外时,类中的每一行代码似乎都会针对断点进行测试.改为个人获取不会提高速度.

由于代码仍然正确,答案的其余部分可能仍然有用.

老阅读声明

colorRed=new Color(bi.getRGB(x,y)).getRed();
Run Code Online (Sandbox Code Playgroud)

读取语句将位图复制到数组中

int[] rgbData = bi.getRGB(0,0, bi.getWidth(), bi.getHeight(), 
                null, 0,bi.getWidth());        
Run Code Online (Sandbox Code Playgroud)

将getRGB放入一个数组中将所有3个颜色值放入一个数组元素中,因此必须通过旋转和"和"来提取单个颜色.y坐标必须乘以图像的宽度.

用于从阵列中读取单个颜色的代码

colorRed=(rgbData[(y*bi.getWidth())+x] >> 16) & 0xFF; 

colorGreen=(rgbData[(y*bi.getWidth())+x] >> 8) & 0xFF; 

colorBlue=(rgbData[(y*bi.getWidth())+x]) & 0xFF; 
Run Code Online (Sandbox Code Playgroud)