首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TwelveMonkeys提供图像裁剪功能吗?

TwelveMonkeys提供图像裁剪功能吗?
EN

Stack Overflow用户
提问于 2019-06-24 03:42:11
回答 1查看 268关注 0票数 0

我试图在图像处理中使用TwelveMonkeys库;但无法找到类似于org.imgscalr.crop(BufferedImage src, int x, int y, int width, int height, BufferedImageOp... ops)的方法,该方法根据x, y, width, height参数裁剪输入图像。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-25 08:16:42

在Java中裁剪图像不需要任何特殊的库。只需使用普通的Java2D和BufferedImage.getSubimage(x, y, width, height)方法:

代码语言:javascript
复制
BufferedImage image = ...
BufferedImage cropped = image.getSubimage(x, y, width, height);

但是,请注意,JavaDoc中的一个部分说:

返回的BufferedImage与原始图像共享相同的数据数组。

这意味着一个图像中的任何修改都将反映在另一个图像中。如果您希望避免这种情况,或者能够释放较大图像的内存,您可以这样做,以便复制:

代码语言:javascript
复制
ColorModel cm = cropped.getColorModel();
BufferedImage copy = new BufferedImage(cm, cropped.getData(), cm.isAlphaPremultiplied(), null);

这里的诀窍是BufferedImage.getData()创建Raster的副本。

或者,如果您根本不需要整个图像,您可以直接读取所需图像的区域。这是javax.imageio API的一个标准特性,并得到TwelveMonkeys插件的支持。这样做通常既节省时间又节省内存:

代码语言:javascript
复制
try (ImageInputStream input = ImageIO.createImageInputStream(file)) {
    ImageReader reader = ImageIO.getImageReaders(input).next(); // TODO: Handle no reader case
    reader.setInput(input);

    // Use reader.getNumImages(boolean) to get number of images in input if needed
    // Use reader.getWidth(int)/reader.getHeight(int) to get dimensions of image

    ImageReadParam param = reader.getDefaultReadParam();
    param.setSourceRegion(new Rectangle(x, y, width, height));

    BufferedImage image = reader.read(0, param); // Read first image
}

PS:我的代码示例都是Java,因为这是Java2D的“本地语言”,但我相信您可以轻松地将它转换为Scala。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56729582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档