Попытка получить несколько изображений из одного изображения - PullRequest
0 голосов
/ 05 октября 2019

Я недавно что-то застрял. То, что я хочу сделать, это получить несколько подизображений из одного большого изображения.

Так что возьмите этот пример. У меня есть рамка 128x128 пикселей, в которой должны быть все изображения. Я помещаю все bufferedImages в список и масштабирую все эти изображения до 128x128.

Изображение, которое вы видите по этой ссылке, показывает, чтоМне нужно 4 субизображения из этого изображения, поэтому в итоге у меня есть 4 изображения размером 128x128, но 4 раза. Или, если у вас есть изображение с разрешением 128x384, оно даст 3 подизображения, идущих сверху вниз.

https://i.stack.imgur.com/RsCkf.png

Я знаю, что есть функция с именем

BufferedImage.getSubimage(int x, int y, int w, int h);

Но проблема в том, что я не могу понять, какую математику мне нужно реализовать. Я попробовал, если высота или ширина больше 200, а затем разделить их на 2, но у меня это никогда не получалось.

1 Ответ

0 голосов
/ 08 октября 2019

Я не уверен, что полностью понимаю, о чем вы спрашиваете, но я думаю, , что вы хотите, выглядит примерно так:

Во-первых, обведите изображение в обоих измерениях.

Затем вычислите размер плитки (меньшее значение 128 и (размер изображения - начальная позиция)). Это сделано для того, чтобы убедиться, что вы не пытаетесь получить плитку за пределами. Если ваши изображения всегда кратны 128 в любом измерении, вы можете просто пропустить этот шаг и просто использовать 128 (просто убедитесь, что вы проверяете, что входные изображения соответствуют этому предположению).

Если вы хотите, чтобы плитки были точно128x128, вы также можете просто пропустить остаток, если размер плитки меньше 128x128, я не уверен, что ваше требование здесь. В любом случае, я оставлю это тебе. : -)

Наконец, получите образ этого размера и координат и сохраните в списке.

Код:

BufferedImage image = ...;
int tileSize = 128;
List<BufferedImage> tiles = new ArrayList<>();

for (int y = 0; y < image.height(); y += tileSize) {
    int h = Math.min(tileSize, image.height() - y);

    for (int x = 0; x < image.width(); x += tileSize) {
        int w = Math.min(tileSize, image.width() - x);
        tiles .add(image.getSubimage(x, y, w, h));
    }
}
...