如何读取子图像栅格

时间:2016-09-08 23:58:53

标签: java arrays bufferedimage

this question ("get pixel array from image")中,答案是获取栅格的数据:

int[] pixels = ((DataBufferInt) bufferedImage.getRaster().getDataBuffer()).getData();

但是,当您将其用于sub images时,它将返回基本图像的数据数组:

  

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

方法getTileGridXOffset()getTileGridYOffset()尽管被描述为

,但仍会返回偏移量
  

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

但看起来无法访问在数组中获取索引所需的栅格字段scanlineStride

其他解决方案

使用getRGB(int startX, int startY, int w, int h, int[] rgbArray, int offset, int scansize)会更快更容易吗?

具体示例

BufferedImage baseBufferedImage = new BufferedImage(2048, 2048, BufferedImage.TYPE_INT_ARGB);
Graphics2D graphics = baseBufferedImage.createGraphics();
graphics.setColor(Color.BLUE);
graphics.fillRect(512, 512, 100, 100);
graphics.dispose();

BufferedImage subBufferedImage = baseBufferedImage.getSubimage(512, 512, 100, 100);
int[] subBufferedImageData = ((DataBufferInt) subBufferedImage.getRaster().getDataBuffer()).getData();
// This is not 255 despite the pixel at 0,0 in subBufferedImage being blue
System.out.print(subBufferedImageData[0] & 0xFF);

1 个答案:

答案 0 :(得分:0)

如果您需要子图像(作为BufferedImage),您可以执行以下操作:

BufferedImage subBufferedImage = baseBufferedImage.getSubimage(512, 512, 100, 100);
// NOTE: getData() creates a copy of the raster/databuffer in contrast to getRaster()
int[] subBufferedImageData = ((DataBufferInt) subBufferedImage.getData(new Rectangle(0, 0, 100, 100)).getDataBuffer()).getData();
System.out.print(subBufferedImageData[0] & 0xFF);

否则,您可以直接跳过子图像,并直接创建所请求的栅格区域的副本,如下所示:

// Creates a copy of the sub region from the raster/databuffer
int[] subBufferedImageData = ((DataBufferInt) baseBufferedImage.getData(new Rectangle(512, 512, 100, 100)).getDataBuffer()).getData();
System.out.print(subBufferedImageData[0] & 0xFF);

两个示例都将打印255,并且包含所有蓝色像素的数组。

您是否觉得使用getRGB更容易使用是完全主观的,取决于您。上面的代码可能更快,或者最糟糕的情况下(我将离开实际测试)。