Java 图像裁剪

4
我知道BufferedImage.getSubimage,但它无法处理裁剪尺寸大于图像尺寸的情况,会抛出异常:
java.awt.image.RasterFormatException: (y + height) is outside raster

我想能够将PNG/JPG/GIF图像裁剪到特定的尺寸,但如果图像小于裁剪区域,则居中放置在白色背景上。是否有相应的调用来实现这一功能?或者我需要手动创建一个图像以使图片居中,如果是这样,我该如何操作?
谢谢
1个回答

9

你不能将图像裁剪得更大,只能裁剪得更小。所以,你需要从目标尺寸开始,比如100x100。然后你的BufferedImagebi)是150x50。

创建一个符合你目标的矩形:

Rectangle goal = new Rectangle(100, 100);

然后将其与您的图像尺寸相交:

Rectangle clip = goal.intersection(new Rectangle(bi.getWidth(), bi.getHeight());

现在,"clip" 对应于适合您目标的部分 bi。在这种情况下是100 x 50。

现在使用"clip"的值获取subImage

BufferedImage clippedImg = bi.subImage(clip,1, clip.y, clip.width, clip.height);

创建一个新的BufferedImage (bi2),大小为goal
BufferedImage bi2 = new BufferedImage(goal.width, goal.height);

将其填充为白色(或您选择的任何背景颜色):

Graphics2D big2 = bi2.getGraphics();
big2.setColor(Color.white);
big2.fillRect(0, 0, goal.width, goal.height);

并将裁剪后的图像绘制到其上。
int x = goal.width - (clip.width / 2);
int y = goal.height - (clip.height / 2);
big2.drawImage(x, y, clippedImg, null);

1
您不需要中间图像clippedImg。只需执行big2.drawImage(bi, (bi2.getWidth() - bi.getWidth()) / 2, (bi2.getHeight() - bi.getHeight()) / 2, null);即可。 - j flemm
如果感兴趣的部分是左上角,那么这个方法可以工作。但是,如果您想要剪切原始图像的顶部或左侧边缘,则无法使用此方法。然而,您可能可以通过使用setClip来避免中间步骤。但我需要思考一下如何计算x和y。 - Devon_C_Miller
@Devon_C_Miller,bi.subImage(clip,1, clip.y, clip.width, clip.height) 这段代码是如何工作的?subImage 方法需要 4 个参数(都是整数)? - user2556079

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