Jak wyodrębnić część tego obrazu w Javie? [zamknięte]

Mam taki arkusz sprite ' a:

Pacman sprites http://i39.tinypic.com/145nvp.png

Jak mogę odczytać ten plik obrazu, aby wyodrębnić jego część do użycia jako sprite ?

Author: James P., 2009-03-07

2 answers

Jeśli obszar sprites odczytuje się w BufferedImage, na getSubimage metoda może być użyta do uzyskania Podobrazia arkusza sprite.

Metoda getSubimage zajmie x, y, oraz width i height pożądanego podimage, dzięki czemu można uzyskać pożądany sprite. Ponieważ większość sprite ' ów wydaje się mieć ten sam rozmiar, myślę, że większość z nich może być pobrana przez zagnieżdżoną pętlę for, aby iterację przez duży obraz.

Na przykład, jeśli obrazek sprite jest załadowany korzystanie z ImageIO klasy (np. read W przeciwieństwie do poprzednich wersji, nie można ich używać w trybie offline, ale w trybie offline można je używać w trybie offline.]}

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

Haczyk polega oczywiście na tym, że powyższy kod będzie działał tylko wtedy, gdy wszystkie sprite 'y są tego samego rozmiaru, więc konieczne będzie pewne dostosowanie, aby działać dla danego arkusza sprite' ów. (Ponieważ prawy górny róg wydaje się różny pod względem wielkości od i inni)

 46
Author: coobird,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-23 12:33:07

Jeśli chcesz po prostu narysować sprite' y, Klasa Grafiki Javy ma metodę drawImage, która wyciągnie dla ciebie określony obszar obrazu. Musisz tylko określić obraz źródłowy, gdzie chcesz narysować sprite na swoim obiekcie graficznym (x, y, szerokość, wysokość) i w jakiej ramce obrazu znajduje się sprite (X, y, szerokość, wysokość).

Zakładając, że szerokość i wysokość sprite ' a są tą samą szerokością i wysokością, którą chcesz narysować na obszarze rysowania, możesz można zdefiniować własną metodę rysowania ramki sprite ' a w następujący sposób

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 ile kolumn znajduje się w Twoim arkuszu sprite. Pierwsze dwie linie metody obliczają x dowolną pozycję y ramki sprite w arkuszu.

Te duże sprity w Twoim arkuszu będą wymagały specjalnej obsługi. Możesz narysować je za pomocą kafelków (w tym przypadku będziesz rysował cztery sprity dla każdego z dużych obrazów) lub możesz ręcznie dowiedzieć się, do czego użyć x, y, szerokości i wysokości te sprite ' y.

Jeśli Twój arkusz sprite był zwykłym arkuszem (wszystkie te same rozmiary) i był ułożony we wzór 5 x 15 tak jak Twój, narysowałbyś 20 klatkę za pomocą następującego wywołania metody

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

Tutaj x i y są pozycją, którą chcesz narysować sprite na swoim obiekcie graficznym, 15 to liczba kolumn w arkuszu sprite, 19 to ramka (numeracja zaczyna się od 0), a 25 to szerokość i wysokość każdego sprite ' a (i przybliżona).

 12
Author: Bill the Lizard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-07 14:11:08