web-dev-qa-db-ja.com

このイメージの一部をJavaで抽出する方法は?

私はこのスプライトシートを持っています:

Pacman sprites

このイメージファイルを読み取って、その一部を Sprite として使用するために抽出するにはどうすればよいですか?

34
Click Upvote

スプライト領域が BufferedImage に読み込まれた場合、 getSubimage メソッドを使用して、スプライトシートのサブイメージを取得できます。

getSubimageメソッドは、目的のサブイメージのxy、およびwidthおよびheightを使用するため、目的のスプライトは得られる。ほとんどのスプライトは同じサイズであるように見えるため、ネストされたforループでそれらのほとんどを取得して、大きな画像を反復処理できると思います。

たとえば、Spriteイメージが ImageIO クラス( read メソッドなど)を使用してロードされ、各Spriteが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
        );
    }
}

もちろん、キャッチはすべてのスプライトが同じサイズである場合にのみ上記のコードが機能するため、特定のスプライトシートで機能するためには調整が必要になります。 (右上隅のサイズは他のものとは異なるようです。)

49
coobird

スプライトを描画するだけの場合、JavaのGraphicsクラスには、画像の特定の領域を引き出すための drawImage メソッドがあります。ソース画像を指定するだけで、グラフィックスオブジェクトにスプライトを描画する場所(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は、スプライトシートにある列の数です。このメソッドの最初の2行は、シート内のスプライトフレームのx位置とy位置を計算します。

シート内の大きなスプライトには特別な処理が必要です。タイルを使用してそれらを描画することができるため(この場合、各大きな画像に対して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はそれぞれの幅と高さですスプライト(概算)。

12
Bill the Lizard