BufferedImage:用相同的数据提取子图像

我想提取一个BufferedImage的矩形。

Javadoc提议getSubImage(x,y,w,h)和getData(矩形)。

getData很酷,但我不想只有光栅。 我想把子图像作为一个BufferedImage对象,但我也需要它的数据数组的修改版本,但javadoc说

public BufferedImage getSubimage(int x,int y,int w,int h):返回由指定的矩形区域定义的子图像。 返回的BufferedImage与原始图像共享相同的数据数组

问:我怎样才能提取一个收缩数据数组的子图像?


给定一个BufferedImage图像,这里有3种方法来创建一个“深度”复制子图像:

// Create an image
BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_4BYTE_ABGR);

// Fill with static
new Random().nextBytes(((DataBufferByte) image.getRaster().getDataBuffer()).getData());

围绕从getData(rect)获得的Raster已经很深的副本创建一个图像。 这涉及到WritableRaster ,所以它可能会在某些Java实现中或将来中断。 应该相当快,因为​​你只复制一次数据:

// Get sub-raster, cast to writable and translate it to 0,0
WritableRaster data = ((WritableRaster) image.getData(new Rectangle(25, 25, 50, 50))).createWritableTranslatedChild(0, 0);

// Create new image with data
BufferedImage subOne = new BufferedImage(image.getColorModel(), data, image.isAlphaPremultiplied(), null);

另一个选项是,创建一个子图像“正常的方式”,然后将光栅复制到一个新的图像。 涉及创建一个子栅格,仍然只复制一次(并且不复制):

// Get subimage "normal way"
BufferedImage subimage = image.getSubimage(25, 25, 50, 50);

// Create empty compatible image
BufferedImage subTwo = new BufferedImage(image.getColorModel(), image.getRaster().createCompatibleWritableRaster(50, 50), image.isAlphaPremultiplied(), null);

// Copy data into the new, empty image
subimage.copyData(subTwo.getRaster());

最后,更简单的路线,只需在新的空白图像上绘制子图像即可。 可能会稍微慢一些,因为它涉及渲染管道,但我认为它应该仍然合理。

// Get subimage "normal way"
BufferedImage subimage = image.getSubimage(25, 25, 50, 50);

// Create new empty image of same type
BufferedImage subThree = new BufferedImage(50, 50, image.getType());

// Draw the subimage onto the new, empty copy
Graphics2D g = subThree.createGraphics();
try {
    g.drawImage(subimage, 0, 0, null);
}
finally {
    g.dispose();
}

我很久以前也有同样的问题,我不想要共享光栅。 我找到的唯一解决方案是创建一个表示子图像的BufferedImage,然后将像素复制到子图像中。

为了让事情真的很快,我直接访问DataBuffer,并使用System.arraycopy()逐行制作数组副本

链接地址: http://www.djcxy.com/p/40783.html

上一篇: BufferedImage : extract subimage with same data

下一篇: easy way to implement deep cloning C#