2011-10-13 14 views
17

Próbuję znaleźć sposób na tworzenie map dla mojej gry 2D java, i pomyślałem o jednej idei, w której przechodzę przez każdy piksel obrazu i zależy od tego, jaki kolor jest pikselem, który byłby płytką rysować.Java Loop poprzez piksele na obrazie?

np. enter image description here

Czy można przechodzić między pikselami obrazów? Jeśli tak, to w jaki sposób?

Czy możesz podać mi pomocne linki lub fragmenty kodu?

Odpowiedz

21

Pamiętaj, że jeśli chcesz pętli nad wszystkich pikseli w obrazie, upewnij się że zewnętrzna pętla nad współrzędna y, tak jak poniżej:

for (int y = 0; y < image.getHeight(); y++) { 
    for (int x = 0; x < image.getWidth(); x++) { 
      int clr = image.getRGB(x, y); 
      int red = (clr & 0x00ff0000) >> 16; 
      int green = (clr & 0x0000ff00) >> 8; 
      int blue = clr & 0x000000ff; 
      image.setRGB(x, y, clr); 
    } 
} 

ten prawdopodobnie sprawi, że twój kod będzie znacznie szybszy, ponieważ będziesz miał dostęp do danych obrazu w kolejności, w której jest przechowywany w pamięci. (Jako rzędy pikseli.)

+1

Jakiej klasy obrazu używa ta odpowiedź? –

+0

BufferedImage IIRC. :) – Zarkonnen

7

Myślę, że Pixelgrabber jest tym, czego szukasz. Jeśli masz problemy z kodem, napisz komentarz. Oto link do javadoc: Pixelgrabber i inne krótkie przykłady: Get the color of a specific pixel, Java program to get the color of pixel

Poniższy przykład pochodzi z ostatniego linku. Dzięki roseindia.net

import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 

public class ImageTest 
{ 
    public static void main(final String args[]) 
     throws IOException 
    { 
     final File file = new File("c:\\example.bmp"); 
     final BufferedImage image = ImageIO.read(file); 

     for (int x = 0; x < image.getWidth(); x++) { 
      for (int y = 0; y < image.getHeight(); y++) { 
       final int clr = image.getRGB(x, y); 
       final int red = (clr & 0x00ff0000) >> 16; 
       final int green = (clr & 0x0000ff00) >> 8; 
       final int blue = clr & 0x000000ff; 

       // Color Red get cordinates 
       if (red == 255) { 
        System.out.println(String.format("Coordinate %d %d", x, y)); 
       } else { 
        System.out.println("Red Color value = " + red); 
        System.out.println("Green Color value = " + green); 
        System.out.println("Blue Color value = " + blue); 
       } 
      } 
     } 
    } 
} 
+0

Czy ten przykład otrzyma każdy piksel? lub piksel na 100,400? –

+0

Nie, ten przykład wystarczy pobrać piksel 100; 40 dla wszystkich potrzebnych pętli przez wszystkie piksele. Myślę, że podwójna pętla poprzez image.width i image.height powinna działać dobrze dla twojego problemu. –

+0

Zaktualizowałem przykład i teraz możesz z nim pracować. –