2016-04-14 79 views
0

我有一个程序需要经常通过BufferedImages逐像素。正常情况下,效率对我来说无关紧要,但我真的希望每一毫秒都能得到。有没有更快的方法遍历Java中BufferedImage的像素?

举个例子,现在,以最快的方式,我发现图像中分离出红色通道看起来是这样的:

int[] rgb = image.getRGB(0, 0, img.getWidth(), img.getHeight(), null, 0, img.getWidth()); 


    for(int i = 0; i < rgb.length; i ++) 
     rgb[i] = rgb[i] & 0xFFFF0000; 

    image.setRGB(0, 0, img.getWidth(), img.getHeight(), rgb, 0, img.getWidth());   

这意味着它会通过图片以填充阵列,再次应用滤镜,最后第三次更新像素。另外考虑到任何alpha通道为0的像素都会被完全清零,它至少还要经过一次。我已经尝试在更传统的嵌套for循环中使用getRGB()和setRGB()的个别像素版本,但这甚至更慢(虽然可能需要更少的RAM,因为它没有int [ ])。

这是Iterable类型解决的那种问题,但我找不到任何将该原理应用于图像的方式。对于这个项目,如果它能够正常工作,那么对于那些不是“最佳实践”的黑客来说,我很好。

是否有任何方式迭代缓冲图像的原始数据?

+0

这个问题已经有了答案。从这里开始http://stackoverflow.com/questions/1975824/fastest-way-to-compare-pixel-values-between-two-bufferedimages?rq=1并去 – gpasch

+1

所以我已经在做整数颜色的一部分那唯一真正的新东西就是“但是总的来说,你应该只是窥探Raster和DataBuffer的性能。”你能更具体一点吗? – user3236716

回答

2

的最快方法是访问了DataBuffer,因为你要的像素值的直接访问,但你必须处理所有的情况下/类型:

public void Test(BufferedImage img) 
    { 
    switch (img.getType()) 
     { 
     case BufferedImage.TYPE_BYTE_GRAY : 
     case BufferedImage.TYPE_3BYTE_BGR : 
      byte[] bufferbyte = ((DataBufferByte)img.getRaster().getDataBuffer()).getData() ; 
      //... 
      break ; 
     case BufferedImage.TYPE_USHORT_GRAY : 
      short[] buffershort = ((DataBuffer)img.getRaster().getDataBuffer()).getData() ; 
      //... 
      break ; 
     //Other cases 
     } 
    } 
相关问题