TwelveMonkeys是否提供图像裁剪功能?

时间:2019-06-24 03:42:11

标签: scala imgscalr twelvemonkeys

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

1 个答案:

答案 0 :(得分:0)

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

BufferedImage image = ...
BufferedImage cropped = image.getSubimage(x, y, width, height);

但是请注意,JavaDoc中的部分内容:

  

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

这意味着一个图像中的任何修改都会反映在另一图像中。如果您希望避免这种情况,或者能够释放较大图像的内存,则可以执行以下操作来进行复制:

ColorModel cm = cropped.getColorModel();
BufferedImage copy = new BufferedImage(cm, cropped.getData(), cm.isAlphaPremultiplied(), null);

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


或者,如果您根本不需要整个图像,则可以直接读取所需图像的区域。这是javax.imageio API的标准功能,并且受TwelveMonkeys插件支持。这样,通常可以节省时间和内存:

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。