从上面的图片中我想要一个RED矩形后面的部分,我可以很容易地得到它, 但问题是我无法获得黄色矩形背后的部分,因为它是旋转的。
那么如何从旋转的形状中获取图像的一部分呢?
例如,我的目标是获取图像的一部分,矩形位于图像上。如果有人将此矩形旋转x度[在任何方向],则在应用旋转后难以提取图像的确切部分。
有什么建议吗?
答案 0 :(得分:0)
这里有一个更长的描述可能的方法。我不太了解Java2D绘图API,但如果我没记错,它有能力做所需的事情。
首先,你需要弄清楚你想要的子区域的平移和旋转,以及直接位于图像左上角的同样大小的矩形。然后反转这种转变。
创建一个由内存中的位图支持的图形上下文。这个应该具有你想要的子图像的大小。设置先前在上下文中计算的逆变换,并在位置0,0处绘制图像。由于Java2D将考虑转换,您现在应该在内存位图中获取所需的子图像。
答案 1 :(得分:0)
Mihir,我认为你可能会因为这次挑战的轮换/ AffineTransform方面而分心,这会让你走上错误的道路。另外请记住,我不完全知道你在这里“得到”是什么意思 - 你想将突出显示的区域保存到图像中吗?你想将它渲染为另一张图像上的水印吗?等......我会在一般情况下尝试回答,让你走上正确的轨道。
您想要的是上图中黄色多边形定义的图像内容;忽略它看起来像一个旋转的矩形的事实。
现在已经很晚了,我在这里错过了一步,但我认为这会让你获得90%的目标,并澄清你需要的最后一块(Graphics2D.setClip)。
注意这是我记忆失败的地方;在某些时候你需要在newG2(newG2.setClip(someShape))上设置剪辑,所以当边界框渲染到它时,你不会得到渲染的图形的完整边界框,而是由一些子集定义的黄色轮廓。
一种简单的方法是创建两个Polygon:
poly1用于获取边界框以复制包含以黄色选择的内容的完整边界框(及其周围的额外内容)
poly2用于在目标Graphics2D(newG2)上设置剪辑,因此当边界框渲染到其中时,我们会剪掉该黄色形状之外的所有内容,因此我们只获取黄色内容。您可能希望使用ARGB image type并将目标图像的背景设置为透明,否则您将获得黑色填充颜色。
我认为这是剪辑的正确方向;多年来我一直在Java2D中看到我的眼球,但已经离开它一段时间了,忘了它是否会给你你想要的与否;你可能需要调整它,但这些都是你需要的工具。