在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);
答案 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
更容易使用是完全主观的,取决于您。上面的代码可能更快,或者最糟糕的情况下(我将离开实际测试)。