2011-10-13 21 views
17

Estoy tratando de encontrar una manera de hacer mapas para mi juego 2D de Java, y pensé en una Idea en la que recorría cada píxel de una imagen y depende del color del píxel que sería la ficha dibujar.Java ¿Loop a través de los píxeles en una imagen?

p. Ej. enter image description here

¿Es posible recorrer las imágenes en píxeles? Si es así, ¿cómo?

¿Podría proporcionarme algunos enlaces útiles o fragmentos de código?

Respuesta

21

Tenga en cuenta que si quieres un bucle sobre todos los píxeles de una imagen, asegúrese de que el bucle externo sobre la coordenada y, de este 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); 
    } 
} 

Este probablemente hará que su código sea mucho más rápido, ya que accederá a los datos de la imagen en el orden en que se almacenan en la memoria. (Como filas de píxeles.)

+1

¿Qué clase de imagen está usando esta respuesta? –

+0

BufferedImage IIRC. :) – Zarkonnen

7

Creo que Pixelgrabber es lo que estás buscando. Si tiene problemas con el código, escriba un comentario. Aquí está el enlace a la javadoc: Pixelgrabber y otros ejemplos breves: Get the color of a specific pixel, Java program to get the color of pixel

El siguiente ejemplo es desde el último eslabón. Gracias a 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

Entonces, ¿ese ejemplo obtendría cada píxel? o el pixel a 100,400? –

+0

No, este ejemplo simplemente toma el píxel 100; 40 para todo lo que necesita un bucle en todos los píxeles. Creo que un bucle doble a través de image.width y image.height debería funcionar bien para su problema. –

+0

He actualizado el ejemplo y ahora puede trabajar con él. –

Cuestiones relacionadas