如何在 Java 中提取此图像的一部分? [关闭]

Posted

技术标签:

【中文标题】如何在 Java 中提取此图像的一部分? [关闭]【英文标题】:How to extract part of this image in Java? [closed] 【发布时间】:2010-10-11 22:22:46 【问题描述】:

我有这个精灵表:

如何读取此图像文件以提取其中的一部分用作sprite?

【问题讨论】:

这可能很适合gamedev.stackexchange.com。 【参考方案1】:

如果精灵区域读入BufferedImage,则可以使用getSubimage方法获取精灵表的子图。

getSubimage方法会取所需子图的xywidthheight,这样就可以获得所需的精灵。由于大多数精灵似乎大小相同,我认为它们中的大多数可以通过嵌套的for 循环来检索以遍历大图像。

例如,如果使用ImageIO类(如read方法)加载精灵图像,并且每个精灵的大小为10像素×10像素,其中5行×5列的精灵,精灵可以通过以下方式获得:

BufferedImage bigImg = ImageIO.read(new File("sheet.png"));
// The above line throws an checked IOException which must be caught.

final int width = 10;
final int height = 10;
final int rows = 5;
final int cols = 5;
BufferedImage[] sprites = new BufferedImage[rows * cols];

for (int i = 0; i < rows; i++)

    for (int j = 0; j < cols; j++)
    
        sprites[(i * cols) + j] = bigImg.getSubimage(
            j * width,
            i * height,
            width,
            height
        );
    

当然,上面的代码只有在所有精灵大小相同的情况下才有效,因此需要进行一些调整才能适用于给定的精灵表。 (因为右上角的大小似乎与其他角落不同。)

【讨论】:

抱歉,我误按了回复按钮。我会在答案中添加更多内容。 看起来应该在 getSubImage() 调用中交换 ij 索引 @guido 感谢您指出错误!代码已修复。 有什么想法可以移动精灵吗?使用面板还是直接在油漆中?【参考方案2】:

如果您只想绘制精灵,Java 的 Graphics 类有一个drawImage 方法,它会为您拉出图像的特定区域。您只需要指定源图像,要在 Graphics 对象上绘制精灵的位置(x、y、宽度、高度),以及精灵位于图像的哪一帧(x、y、宽度、高度) .

假设精灵的宽度和高度与您要在绘图区域上绘制的宽度和高度相同,您可以定义自己的方法来绘制精灵帧,如下所示

void drawSpriteFrame(Image source, Graphics2D g2d, int x, int y,
                     int columns, int frame, int width, int height)

    int frameX = (frame % columns) * width;
    int frameY = (frame / columns) * height;
    g2d.drawImage(source, x, y, x+width, y+height,
                  frameX, frameY, frameX+width, frameY+height, this);

columns 是您的精灵表中有多少列。该方法的前两行计算表单中精灵帧的 x any y 位置。

工作表中的那些大精灵需要特殊处理。您可以用瓷砖绘制它们(因此在这种情况下,您将为每个大图像绘制四个精灵),或者您可以手动确定用于这些精灵的 x、y、宽度和高度。

如果您的 sprite 表是常规表(所有 sprite 大小相同)并且按照 5 x 15 的模式排列,您将使用以下方法调用绘制第 20 帧

Toolkit tk = Toolkit.getDefaultToolkit();    
Image pacman = tk.getImage(getURL("pacman.png"));
...
drawFrame(pacman, g2d, x, y, 15, 19, 25, 25);

这里,x 和 y 是您要在 Graphics 对象上绘制精灵的位置,15 是精灵表中的列数,19 是框架(编号从 0 开始),25 是宽度和每个精灵的高度(我估计的)。

【讨论】:

以上是关于如何在 Java 中提取此图像的一部分? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

java图像处理[关闭]

如何从android中的jpeg图像中提取文本[关闭]

如何在 java 中创建一些东西来根据纵横比调整图像的大小和位置? [关闭]

如何将图像保存到java中的目录[关闭]

如何从图像中提取所需的文本部分,而不是使用 OCR 提取图像中的所有文本?

如何从旋转图像中提取人脸部分?