java - 缓冲图像 : extract subimage with same data

标签 java bufferedimage raster

我想提取一个 BufferedImage 的矩形。

Javadoc 提出 getSubImage(x,y,w,h) 和 getData(rectangle)。

getData 很酷,但我不想要光栅。我希望子图像作为 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 - 缓冲图像 : extract subimage with same data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36462710/

相关文章:

java - 打乱二维数组,同时将列元素保持在一起

java - 在不损失质量的情况下调整图像大小

java - 使 bufferedImage 变小的代码出错

r - 计算 2 lon lats 之间的距离,但避免通过 R 中的 coaSTLine

join - Postgis:用于与人口普查枚举区多边形进行空间连接的最佳栅格切片大小

java - 项目转换为maven后JSP类未定义类型

java - Apache 公共(public)资源 : ClassNotFoundException

java - 为什么我的 Java 代码无法运行?

Java ImageIO,无法设置像素值?

r - 如何找到逐像素标准偏差?