자바 에서이 이미지의 일부를 추출하는 방법은 무엇입니까? [닫은

StackOverflow https://stackoverflow.com/questions/621835

  •  05-07-2019
  •  | 
  •  

문제

이 스프라이트 시트가 있습니다.

Pacman sprites

이 이미지 파일을 읽으려면 어떻게 사용할 수 있습니까? 스프라이트 ?

도움이 되었습니까?

해결책

스프라이트 영역이 a BufferedImage,, getSubimage 방법을 사용하여 스프라이트 시트의 서브 이미지를 얻을 수 있습니다.

그만큼 getSubimage 방법이 x, y, 그리고 width 그리고 height 원하는 하위 이미지의 경우, 원하는 스프라이트를 얻을 수 있습니다. 대부분의 스프라이트는 같은 크기 인 것처럼 보이므로 대부분의 중첩으로 검색 할 수 있다고 생각합니다. for 큰 이미지를 통해 반복합니다.

예를 들어, 스프라이트 이미지가 ImageIO 클래스 (예 : read 방법), 각 스프라이트는 크기가 10 픽셀 x 10 픽셀이며 5 열 x 5 열 x 스프라이트는 다음과 같이 얻을 수 있습니다.

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의 그래픽 클래스는 다음과 같습니다. 도로 이미지의 특정 영역을 끌어 올리는 메소드. 그래픽 객체 (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 x를 계산합니다.

시트에있는 큰 스프라이트에는 특별한 취급이 필요합니다. 타일로 그릴 수 있거나 (이 경우 큰 이미지 각각에 대해 4 개의 스프라이트를 그리거나) 스프라이트에 사용할 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는 그래픽 객체에 스프라이트를 그릴 위치입니다. 15는 스프라이트 시트의 열 수, 19는 프레임 (0에서 시작), 25는 각각의 너비와 높이입니다. 스프라이트 (나는 근사).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top