Как извлечь часть этого изображения в Java?

У меня есть этот лист спрайтов:

спрайты Pacman http://i39.tinypic.com/145nvp.png

Как я могу прочитать этот файл изображения, чтобы извлечь часть его для использования в качестве sprite?

30
задан Click Upvote 07 марта '09 в 16:22
источник поделиться
2 ответов

Если область спрайтов считывается в BufferedImage, getSubimage можно использовать для получения профиля изображения спрайта.

Метод getSubimage примет значения x, y и width и height желаемого субимажа, так что желаемый спрайт может быть получен. Поскольку большинство спрайтов, похоже, имеют одинаковый размер, я думаю, что большинство из них может быть восстановлено вложенным циклом 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
        );
    }
}

Улов, конечно, приведенный выше код будет работать только в том случае, если все спрайты имеют одинаковый размер, поэтому для работы с данным листом спрайта потребуется некоторая корректировка. (Поскольку верхний правый угол кажется другим по размеру от других.)

46
ответ дан coobird 07 марта '09 в 16:38
источник поделиться

Если вы просто хотите нарисовать спрайты, класс Java Graphics имеет метод drawImage, который вытащит определенную область изображения для тебя. Вам просто нужно указать исходное изображение, в котором вы хотите нарисовать спрайт на объекте Graphics (x, y, width, height) и в каком кадре изображения находится спрайт (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 любое y-положение кадра спрайта в вашем листе.

Эти большие спрайты на вашем листе потребуют специальной обработки. Вы можете нарисовать их с помощью плиток (так что в этом случае вы будете рисовать четыре спрайта для каждого из больших изображений), или вы можете вручную определить, какие x, y, width и height использовать для этих спрайтов.

Если ваш лист спрайтов был обычным листом (все спрайты такого же размера), и он был устроен по шаблону 5 х 15, как и у вас, вы бы нарисовали 20-й кадр со следующим вызовом метода

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

Здесь x и y - позиция, в которой вы хотите нарисовать спрайт на своем графическом объекте, 15 - количество столбцов на вашем листе спрайта, 19 - кадр (нумерация начинается с 0), а 25 - ширина и высота каждого спрайта (I аппроксимируется).

12
ответ дан Bill the Lizard 07 марта '09 в 16:56
источник поделиться

Другие вопросы по меткам