2011-10-13 16 views
17

Sto provando a trovare un modo per creare mappe per il mio gioco java 2D, e ho pensato a una Idea in cui avrei fatto un loop di ogni pixel di un'immagine e dipende dal colore del pixel che sarebbe stata la tessera disegnare.Ciclo Java attraverso i pixel in un'immagine?

ad es. enter image description here

È possibile eseguire il ciclo di pixel di immagini? Se lo è, come?

Potresti fornirmi alcuni link utili o snippet di codice?

risposta

21

Si noti che se si desidera un ciclo su tutti i pixel di un'immagine, assicuratevi di fare il ciclo esterno sopra la coordinata y, in questo modo:

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

Questo probabilmente renderà il tuo codice molto più veloce, poiché accederai ai dati dell'immagine nell'ordine in cui è stato memorizzato. (Come file di pixel.)

+1

Quale classe di immagini usa questa risposta? –

+0

BufferedImage IIRC. :) – Zarkonnen

7

Penso che Pixelgrabber sia quello che stai cercando. Se hai problemi con il codice, scrivi un commento. Ecco il link alla javadoc: Pixelgrabber e altri brevi esempi: Get the color of a specific pixel, Java program to get the color of pixel

Il seguente esempio è tratto dall'ultimo collegamento. Grazie alla 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

Quindi, l'esempio otterrà ciascun pixel? o il pixel a 100.400? –

+0

No, questo esempio cattura solo il pixel 100; 40 per tutto ciò che serve un ciclo attraverso tutti i pixel. Penso che un doppio ciclo attraverso image.width e image.height dovrebbe funzionare bene per il tuo problema. –

+0

Ho aggiornato l'esempio e ora puoi lavorarci. –

Problemi correlati