Вам не нужна никакая специальная библиотека для обрезки изображений на 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
.
В качестве альтернативы, если вам совсем не нужно все изображение, вы можете просто прочитать область изображения, которую вы хотите напрямую.Это стандартная функция API javax.imageio
и поддерживается подключаемыми модулями 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, но я уверен, что вы можете легко конвертировать егоСкала.