首页 > 解决方案 > 试图从单个图像中获取多个图像

问题描述

我最近被一些事情困住了。我想要做的是从一张大图像中获取多个子图像。

所以举这个例子。我有一个 128x128 像素的框架,所有图像都需要在其中。我将所有缓冲图像放在一个列表中,并将所有这些图像缩放到 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,但这对我来说从来没有用过。

标签: javabufferedimage

解决方案


我不确定我是否完全理解您的要求,但我认为您想要的是这样的:

首先,在两个维度上循环图像。

然后计算图块的大小(较小的值 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));
    }
}

推荐阅读