在BufferedImage的int 像素数组中工作

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

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

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

最后一点从setRGB的JavaDoc基本上非常清楚,它指出:

…对于具有IndexColorModel的图像,选择具有最近颜色的索引。

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

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

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

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

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

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

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

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

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

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