在BufferedImage的int []像素数组中工作

时间:2010-12-03 18:26:23

标签: java pixel bufferedimage

使用 setRGB getRGB 方法处理BufferedImage时,我注意到两件事:

  1. setRGB getRGB 方法在某些系统上可能会非常慢(比修改int []数组慢两个数量级)。

  2. 无法保证 setRGB 后面的 getRGB 会返回您传递的相同像素

  3. 最后一点基本上非常清楚 setRGB 的JavaDoc,其中指出:

      

    ...对于带有IndexColorModel的图像,   最接近颜色的索引是   选择的。

    看到我可以直接在BufferedImage的int []像素中工作,我可以通过这样做来访问,例如:

     int[] a = ((DataBufferInt) tmp.getRaster().getDataBuffer()).getData();
    

    我想知道:直接操纵int[]中的像素是否有任何已知的缺点/陷阱?

2 个答案:

答案 0 :(得分:4)

getData()的全部内容使您可以访问支持int数组,这正是为了优化,所以最有可能带来的好处就是缺点。

缺点取决于您如何使用缓冲图像。如果您在编辑时将其绘制到屏幕上,则可能会在屏幕上遇到一些瑕疵(如未及时着色的像素),在这种情况下,您应该考虑双缓冲(这涉及复制整个图像)每次刷新)。

答案 1 :(得分:0)

不确定这是否与您的问题相关,但在使用getSubimage(int x, int y, int w, int h)方法创建BufferedImage时会遇到问题。

  

返回由指定矩形区域定义的子图像。该   返回BufferedImage与原始数据共享相同的数据数组   图像。

方法getTileGridXOffset()getTileGridYOffset()返回偏移量,尽管被描述为

  

返回tile网格相对于原点的x偏移量For   例如,tile(0,0)的位置的x坐标。 这是   永远为零。

但是因为你不能(据我所知)访问栅格的scanlineStride字段,你将无法获得该数组的正确索引。