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

问题描述 投票:33回答:2

我有这个精灵表:

Pacman sprites

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

java 2d sprite 2d-games
2个回答
49
投票

如果精灵区域读入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
        );
    }
}

当然,上述代码仅在所有精灵的大小相同时才起作用,因此需要进行一些调整才能使用给定的精灵表。 (因为右上角的大小似乎与其他角落不同。)


12
投票

如果您只想绘制精灵,Java的Graphics类有一个drawImage方法,可以为您拉出图像的特定区域。你只需要指定源图像,你想在你的Graphics对象上绘制精灵(x,y,width,height),以及精灵所在的图像的哪个帧(x,y,width,height) 。

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

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任意y位置。

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

如果您的精灵表是一张普通纸(所有精灵都是相同的尺寸)并且它的排列方式是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对象上绘制sprite的位置,15是sprite表中的列数,19是帧(编号从0开始),25是每个的宽度和高度精灵(我近似)。

© www.soinside.com 2019 - 2024. All rights reserved.