Как извлечь часть этого изображения в Java? [закрыто]
Вопрос
У меня есть этот спрайт-лист:
Как я могу прочитать этот файл изображения, чтобы извлечь его часть для использования в качестве спрайт ?
Решение
Если область спрайтов считывается в < code> 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
);
}
}
Конечно, выгода в том, что приведенный выше код будет работать только в том случае, если все спрайты имеют одинаковый размер, поэтому для работы с данным листом спрайта потребуется некоторая корректировка. (Поскольку верхний правый угол, кажется, отличается по размеру от других.)
Другие советы
Если вы просто хотите рисовать спрайты, у класса Java-графики есть 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, 15 - это число столбцов в вашем листе спрайта, 19 - это рамка (нумерация начинается с 0), а 25 - это ширина и высота каждого спрайта (я приблизительно).