Предоставляет ли TwelveMonkeys функцию обрезки изображения? - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь использовать библиотеку TwelveMonkeys для манипулирования изображениями; но не может найти метод, аналогичный org.imgscalr.crop(BufferedImage src, int x, int y, int width, int height, BufferedImageOp... ops), который обрезает входное изображение в соответствии с параметрами x, y, width, height.

1 Ответ

0 голосов
/ 25 июня 2019

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

...