当前位置: 首页 > 知识库问答 >
问题:

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

东郭海阳
2023-03-14

我想提取一个BufferedImage的矩形。

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

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

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

共有1个答案

邵锐
2023-03-14

给定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();
}
 类似资料:
  • 我正在使用的数据库有许多具有相同列但(显然)具有不同表名的表(不是我设计的)。例如(这些是数据库表名): 有没有可能用JPA和Hibernate将这些映射到一个Java类实体?类的名称是,然后在使用它时传入例如,以便对象使用表? 还是只使用普通的、普通的Java对象来完成这样的任务更好? 谢谢你!

  • 问题内容: 我有下表: 我想让Folder类具有父子关系。 问题答案: 我相信正确的映射将是: 该会的工作只有当每个家长有最多一个孩子,上面的代码适用于更一般的情况下,父母可以有许多儿童。另外,为简单起见,我省略了get / set方法。

  • 我有这个问题: 您将获得一个整数 A 和一个整数 k 的数组。您可以将 A 的元素递减到 k 次,目标是生成一个元素都相等的连续子数组。返回可以用这种方式生成的最长的连续子数组的长度。 例如,如果 A 是 [1,7,3,4,6,5] 并且 k 是 6,那么您可以生成 [1,7,3,4-1,6-1-1-1,5-1-1] = [1,7,3,3,3,3],因此您将返回 4。 最佳解决方案是什么?

  • 在上面的XML中,父节点和它的一个子节点(即中心)有相同的标记名。我知道我可以在主标记的索引0处进行多个步骤的解析,然后中心标记的索引0将给出ID,中心标记的索引1将给出中心的值333,等等,但是有没有一种方法可以直接得到ID和中心的值(11,333)。

  • 这是我想做的:将用户连接到他们观看的视频,就像用户- 我是如何做到的: CSV文件有2列,标题为用户和视频。用户下面是一个标识每个用户的数字,视频下面是一个标识每个视频的数字。一个用户对一个视频。有时用户的名字会在列表中再次出现在不同的视频中。有时视频编号会再次出现,因为它是由不同的用户观看的。 但是,这将返回关系用户在每个关系中查看1个视频。因此,每个用户和视频都有多个节点。 我想做的:创建更多

  • 目前正在进行一个项目,我的Spring Boot项目需要在同一个DB服务器中利用多个数据源或模式。我发现了几个在spring boot中教授多数据源配置的教程,其中实体foo存在于数据源A中,bar存在于数据源B中,即下面的内容。, https://scattercode.co.uk/2016/01/05/multiple-databases-with-spring-boot-和spring数据j