java – BufferedImage:提取具有相同数据的子图像

我想提取一个BufferedImage的矩形.

Javadoc提出getSubImage(x,y,w,h)和getData(矩形).

getData很酷,但我不想只使用栅格.我希望subimage作为BufferedImage对象,但我还需要它的数据数组的修改版本,但javadoc说

public BufferedImage getSubimage(int x,int y,int w,int h) : Returns a subimage defined by a specified rectangular region. The returned BufferedImage shares the same data array as the original image.

问:如何使用收缩数据数组提取子图像?

最佳答案:

给定一个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();
}
上一篇:java – 检查图像是否为灰度的可靠方法


下一篇:使用Java二维码图片