【问题标题】:Get portion of an image using rotated Shape使用旋转的形状获取图像的一部分
【发布时间】:2013-07-24 21:23:09
【问题描述】:

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

那么我怎样才能从图像上的旋转形状中获取一部分呢?

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

有什么建议吗?

【问题讨论】:

  • 您可以使用仿射变换进行旋转:docs.oracle.com/javase/tutorial/2d/advanced/transforming.html
  • 您好,我知道 AF 但如何?它会在图像上吗? getsubimage 只给出四个坐标左上角的宽度和高度?所以首先我应该旋转一个与形状旋转的θ度相同的图像,然后使用旋转矩形的形状边界的getsubimage方法?
  • 形状相对于其中心旋转。

标签: java image image-processing awt java-2d


【解决方案1】:

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

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

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

【讨论】:

【解决方案2】:

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 image type 并将目标图像的背景设置为透明,否则您将获得黑色填充颜色。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-30
    • 2017-01-04
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 2011-02-04
    相关资源
    最近更新 更多