在Java中通过多边形区域裁剪图像

3
通过使用Canvas和JS,我可以绘制出像这样的形状,并获得每个点的x,y坐标:enter image description here 可以通过选择多于4个点来选择区域,请查看此链接以了解更多信息。
我需要使用这些点保存和裁剪所选区域的图像。我不能使用BufferedImage,因为它只是矩形的。在Java中我应该使用哪个库?

嗯,图像总是会是一个矩形的,你可以使用点来生成一个形状,并用它们生成一个裁剪区域来绘制图像,但正如我所说,结果始终是一个矩形图像,只是根据你选择的内容和背景颜色来显示。 - undefined
1个回答

5

好的,那么从这里开始...

Your original image

我使用了…

BufferedImage source = ImageIO.read(new File("Example.jpg"));
GeneralPath clip = new GeneralPath();
clip.moveTo(65, 123);
clip.lineTo(241, 178);
clip.lineTo(268, 405);
clip.lineTo(145, 512);
clip.closePath();

Rectangle bounds = clip.getBounds();
BufferedImage img = new BufferedImage(bounds.width, bounds.height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = img.createGraphics();
clip.transform(AffineTransform.getTranslateInstance(-65, -123));
g2d.setClip(clip);
g2d.translate(-65, -123);
g2d.drawImage(source, 0, 0, null);
g2d.dispose();

ImageIO.write(img, "png", new File("Clipped.png"));

生成...

Clipped

现在,图片是矩形的,这就是它的工作原理。
现在,setClip非常粗糙,并且不受任何RenderingHints的影响,您可以改用“软剪辑”,这更加复杂,但生成更好的结果。有关更多详细信息,请参见this examplethis exmaple

谢谢,但是如果我选择5或6个点而不是4个点,那么我就不能使用“矩形”边界! - undefined
看看这个链接,了解一下如果选择超过4个点会发生什么:http://www.jqueryrain.com/?FahE34Ft - undefined
@Majico 你可以使用任意数量的点,仍然可以使用 getBounds 函数,但是您可能需要了解 Rectangle#getMinX/YRectangle#getMaxX/Y - undefined
感谢您提供的完整解决方案,它运行得非常顺利!:) - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接