-1

源图像

从上图中,如果我想要红色矩形后面的部分,我可以很容易地得到它,但问题是我无法得到黄色矩形后面的部分,因为它是旋转的。

那么如何从图像上的旋转形状中获取图像的一部分呢?

例如,我的目标是获取矩形位于图像上的图像的一部分。如果有人将这个矩形旋转 x 度 [在任何方向上],那么在应用旋转后很难提取图像的确切部分。

有什么建议么?

4

2 回答 2

0

这里对一种可能的方法进行了更冗长的描述。我不太了解 Java2D 绘图 API,但如果我没记错的话,它具有执行所需操作的能力。

首先,您必须计算出您想要的子区域与位于图像左上角的相同大小的矩形相比的平移和旋转。然后反转这个变换。

创建一个由内存中的位图支持的图形上下文。这个应该有你想要的子图像的大小。设置您之前在上下文中计算的逆变换,并在位置 0,0 处绘制图像。由于 Java2D 将考虑转换,您现在应该在内存位图中获得所需的子图像。

于 2013-08-07T05:49:34.877 回答
0

Mihir,我认为您可能会被此挑战的旋转/仿射变换方面分心,这会导致您走错路。另请记住,我不完全知道您所说的“获取”是什么意思——您想将突出显示的区域保存到图像中吗?您想将其渲染为另一张图像上的水印吗?等等...我会在一般情况下尝试回答,以使您走上正轨。

想要的是上图中黄色多边形定义的图像中的内容;忽略它看起来像一个旋转的矩形的事实。

已经很晚了,我在这里错过了一步,但我认为这会让你完成 90% 的工作,并澄清你需要的最后一块 (Graphics2D.setClip)。

  • 创建一个java.awt.Polygon来定义您想要的区域周围的区域。
  • 使用 getBounds() 或 getBounds2D() 获取在渲染成矩形时容纳此多边形所需的边界框的宽度/高度。(例如边界框)
  • 使用这些宽度/高度值创建一个新的 BufferedImage。
  • 从新的 BufferedImage 中获取 Graphics2D(例如 newG2)
  • newG2.drawImage(originalImage, boundingBox.x, boundingBox.y, boundingBox.width, boundingBox.height)

注意这是我记忆力下降的地方;在某些时候,您需要在 newG2 ( newG2.setClip(someShape) ) 上设置剪辑,因此当将边界框渲染到其中时,您不会得到渲染的图形的完整边界框,而是由定义的某个子集黄色轮廓。

一种简单的方法是创建两个多边形:

  1. poly1 = 定义原始图像中黄色选择的 java.awt.Polygon。
  2. poly2 = 一个 java.awt.Polygon,它定义了与 Polygon 完全相同的形状,但移动到了 0,0 原点。

poly1 用于让边界框复制出完整的边界框,其中包含以黄色选择的内容(以及它周围的额外内容)

poly2 用于在目标 Graphics2D (newG2) 上设置剪辑,因此当将边界框渲染到其中时,我们会剪掉黄色形状之外的所有内容,因此我们只会得到黄色的内容。您可能希望使用ARGB 图像类型并将目标图像的背景设置为透明,否则您将获得黑色填充颜色。

认为这是剪辑的正确方向;多年来,我一直在关注 Java2D,但已经离开了一段时间,忘记了这是否会给你带来你想要的东西;您可能需要对其进行调整,但这些都是您需要的工具。

于 2013-08-26T04:19:14.813 回答