在BufferedImage的int 像素数组中工作
使用setRGB和getRGB方法处理BufferedImage时,我注意到两件事:
-
setRGB和getRGB方法在某些系统上可能会非常慢(比修改int []数组慢两个数量级)。
-
无法保证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
字段,你将无法获得数组的正确索引。