使用旋转的形状获取图像的一部分

时间:2013-07-25 06:09:23

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

Source Image

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

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

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

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

这里有一个更长的描述可能的方法。我不太了解Java2D绘图API,但如果我没记错,它有能力做所需的事情。

首先,你需要弄清楚你想要的子区域的平移和旋转,以及直接位于图像左上角的同样大小的矩形。然后反转这种转变。

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

答案 1 :(得分:0)

Mihir,我认为你可能会因为这次挑战的轮换/ AffineTransform方面而分心,这会让你走上错误的道路。另外请记住,我不完全知道你在这里“得到”是什么意思 - 你想将突出显示的区域保存到图像中吗?你想将它渲染为另一张图像上的水印吗?等......我会在一般情况下尝试回答,让你走上正确的轨道。

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

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

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

注意这是我记忆失败的地方;在某些时候你需要在newG2(newG2.setClip(someShape))上设置剪辑,所以当边界框渲染到它时,你不会得到渲染的图形的完整边界框,而是由一些子集定义的黄色轮廓。

一种简单的方法是创建两个Polygon:

  1. poly1 =一个java.awt.Polygon,用于定义ORIGINAL图像中的黄色选择。
  2. poly2 =一个java.awt.Polygon,它定义了完全相同的Polygon形状,但转移到了0,0原点。
  3. poly1用于获取边界框以复制包含以黄色选择的内容的完整边界框(及其周围的额外内容)

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

    认为这是剪辑的正确方向;多年来我一直在Java2D中看到我的眼球,但已经离开它一段时间了,忘了它是否会给你你想要的与否;你可能需要调整它,但这些都是你需要的工具。