TwelveMonkeys 是否提供图像裁剪功能?
Does TwelveMonkeys provide image crop functionality?
我正在尝试使用 TwelveMonkeys 库进行图像处理;但找不到类似于 org.imgscalr.crop(BufferedImage src, int x, int y, int width, int height, BufferedImageOp... ops)
的方法,该方法根据 x, y, width, height
参数裁剪输入图像。
您不需要任何特殊的库来裁剪 Java 中的图像。只需使用简单的 Java2D 和 BufferedImage.getSubimage(x, y, width, height)
方法:
BufferedImage image = ...
BufferedImage cropped = image.getSubimage(x, y, width, height);
但是请注意,Java文档中的部分内容为:
The returned BufferedImage
shares the same data array as the original image.
这意味着对一幅图像的任何修改都会反映在另一幅图像中。如果你想避免这种情况,或者能够释放大图像的内存,你可以这样做,制作一个副本:
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 的 "native language",但我相信您可以轻松地将其转换为 Scala .
我正在尝试使用 TwelveMonkeys 库进行图像处理;但找不到类似于 org.imgscalr.crop(BufferedImage src, int x, int y, int width, int height, BufferedImageOp... ops)
的方法,该方法根据 x, y, width, height
参数裁剪输入图像。
您不需要任何特殊的库来裁剪 Java 中的图像。只需使用简单的 Java2D 和 BufferedImage.getSubimage(x, y, width, height)
方法:
BufferedImage image = ...
BufferedImage cropped = image.getSubimage(x, y, width, height);
但是请注意,Java文档中的部分内容为:
The returned
BufferedImage
shares the same data array as the original image.
这意味着对一幅图像的任何修改都会反映在另一幅图像中。如果你想避免这种情况,或者能够释放大图像的内存,你可以这样做,制作一个副本:
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 的 "native language",但我相信您可以轻松地将其转换为 Scala .