web-dev-qa-db-fra.com

Comment extraire une partie de cette image en Java?

J'ai cette feuille Sprite:

Pacman sprites

Comment puis-je lire ce fichier image pour en extraire une partie pour l'utiliser comme Sprite ?

35
Click Upvote

Si la zone des sprites est lue dans un BufferedImage , la méthode getSubimage peut être utilisée pour obtenir une sous-image de la feuille Sprite.

La méthode getSubimage prendra les x, y et les width et height de la sous-image souhaitée, de sorte que le Sprite souhaité puisse être obtenu. Puisque la plupart des sprites semblent avoir la même taille, je pense que la plupart d'entre eux peuvent être récupérés par une boucle imbriquée for pour parcourir la grande image.

Par exemple, si l'image Sprite est chargée à l'aide de la classe ImageIO (telle que la méthode read ), et que chaque Sprite vaut 10 pixels par 10 pixels de taille, où sont 5 lignes par 5 colonnes de sprites, les sprites peuvent être obtenus par ce qui suit:

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
        );
    }
}

Le hic est, bien sûr, que le code ci-dessus ne fonctionnera que si tous les sprites sont de la même taille, donc il faudra effectuer un ajustement pour fonctionner pour la feuille Sprite donnée. (Comme le coin supérieur droit semble être de taille différente des autres.)

50
coobird

Si vous voulez simplement dessiner les sprites, la classe Graphics de Java a une méthode drawImage qui tirera une zone spécifique de l'image pour vous. Il vous suffit de spécifier l'image source, où vous voulez dessiner le Sprite sur votre objet Graphics (x, y, largeur, hauteur), et dans quel cadre de l'image se trouve le Sprite (x, y, largeur, hauteur) .

En supposant que la largeur et la hauteur du Sprite sont de la même largeur et hauteur que vous souhaitez dessiner sur la zone de dessin, vous pouvez définir votre propre méthode pour dessiner un cadre Sprite comme suit

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 est le nombre de colonnes dans votre feuille Sprite. Les deux premières lignes de la méthode calculent la position x any y du cadre Sprite dans votre feuille.

Ces gros sprites dans votre feuille nécessiteront une manipulation spéciale. Vous pouvez les dessiner avec des tuiles (vous dessinez donc quatre sprites pour chacune des grandes images dans ce cas), ou vous pouvez déterminer manuellement les x, y, la largeur et la hauteur à utiliser pour ces sprites.

Si votre feuille Sprite était une feuille régulière (tous les sprites de la même taille) et qu'elle était disposée selon un motif 5 x 15 comme le vôtre, vous dessineriez le 20ème cadre avec l'appel de méthode suivant

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

Ici, x et y sont la position à laquelle vous souhaitez dessiner le Sprite sur votre objet Graphics, 15 est le nombre de colonnes dans votre feuille Sprite, 19 est le cadre (la numérotation commence à 0) et 25 est la largeur et la hauteur de chaque Sprite (j'ai approximé).

12
Bill the Lizard