2012-04-12 13 views
17

Stavo realizzando un editor di mappe 2D per il mio gioco platform di piastrelle quadrate, quando ho realizzato che potevo davvero usare un editor di immagini con le sue capacità di ridisegnare pixel adiacenti e molti altri, quindi ho pensato di provare a leggere un livello dipinto da un app che convertirà quindi in un formato lightweigh.Come posso leggere i valori dei pixel dell'immagine come RGB nell'array 2d?

Non sono sicuro che l'utilizzo di un formato bitmap sia obbligatorio per tale scopo, ma suppongo che la lettura di un pixel specifico sia più semplice che con PNG, ad esempio.

Quindi il mio obiettivo è aprire un'immagine, scorrere tutti i pixel, cercare quelli che corrispondono al mio schema di tessere e inserire la tessera corrispondente nella serie di blocchi.

Nota: ho già il mio formato lightweigh, quindi ho bisogno di leggere solo i valori dei pixel nell'array.


Soluzione: mio disegno si presenta così:

Bitmap myBitmap = new Bitmap(@"input.png");    
      for (int x = 0; x < myBitmap.Width; x++) 
      { 
       for (int y = 0; y < myBitmap.Height; y++) 
       {      
        Color pixelColor = myBitmap.GetPixel(x, y); 
        // things we do with pixelColor 
       } 
      } 


Esempio 2:

Bitmap myBitmap = new Bitmap(@"input.png"); 

      for (int x = 0; x < myBitmap.Width; x++) 
      { 
       for (int y = 0; y < myBitmap.Height; y++) 
       { 
        // Get the color of a pixel within myBitmap. 
        Color pixelColor = myBitmap.GetPixel(x, y); 
        string pixelColorStringValue = 
         pixelColor.R.ToString("D3") + " " + 
         pixelColor.G.ToString("D3") + " " + 
         pixelColor.B.ToString("D3") + ", "; 

        switch (pixelColorStringValue) 
        { 
         case "255 255 255": 
          { 
           // white pixel 
           break; 
          } 
         case "000 000 000": 
          { 
           // black pixel 
           break; 
          } 
        } 
       } 
      } 
+0

Nota a margine: l'interruttore/caso sulle stringhe non ha valore. Internamente è solo una comparazione di stringhe. Il semplice confronto dei valori RGB reali è destinato ad essere più efficiente. – Nyerguds

+0

@Nyerguds questo era anni fa quindi non ricordo perché l'ho fatto in quel modo. Sono sicuro che c'è un modo molto migliore per fare tutto in questa domanda, e se dovessi risolvere qualunque problema avessi allora, oggi, il codice sarebbe completamente diverso. – user1306322

+0

Hehe. Questo è il modo in cui di solito va guardando al vecchio codice, immagino :) – Nyerguds

risposta

31

Bene, se ho capito bene, vuoi scorrere i pixel nell'immagine, eseguire una sorta di test, e se passa vuoi archiviare quel pixel in un array. Ecco come si poteva farlo:

using System.Drawing; 

Bitmap img = new Bitmap("*imagePath*"); 
for (int i = 0; i < img.Width; i++) 
{ 
    for (int j = 0; j < img.Height; j++) 
    { 
     Color pixel = img.GetPixel(i,j); 

     if (pixel == *somecondition*) 
     { 
      **Store pixel here in a array or list or whatever** 
     } 
    } 
} 

Non penso hai bisogno di qualcos'altro. Se hai bisogno dei valori RGB specifici, puoi ottenerli dai metodi corrispondenti nell'oggetto pixel.

+0

Haha, questo è esattamente quello che mi è venuto in mente :) – user1306322

+2

Per chiunque si chieda, per creare un array di byte RGB, si dovrebbe usare qualcosa come: 'int offset = y * bitmap.Width * 3 + x * 3; rgbBytes [offset + 0] = pixel.R; rgbBytes [offset + 1] = pixel.G; rgbBytes [offset + 2] = pixel.B; 'Nota come le coordinate' x' e 'y' sono una fonte comune di confusione (x è la colonna ey è la riga). Dovrebbe essere ovvio come adattare questo per funzionare per RGBA, BGR, ecc. – Kat

-1

penso di aver fatto qualcosa di simile una volta. Ecco un frammento di codice di quello che stavo facendo:

public static void main(String[] args) { 
     try { 

      String path = "src/colors.jpg"; 
      BufferedImage image = ImageIO.read(new File(path)); 
      int w = image.getWidth(); 
      int h = image.getHeight(); 
      for (int y = 0; y < h; y++) { 
       for (int x = 0; x < w; x++) { 
        Color c = new Color(image.getRGB(x, y)); 
        int red = c.getRed(); 
        int green = c.getGreen(); 
        int blue = c.getBlue(); 
        countColor(red, green, blue); 
        totalCount++; 
       } 
      } 

      printColors(); 

     } catch (Exception ex) { 
      System.out.println(ex.getMessage()); 
     } 
    } 

Nel ciclo for interno si può mettere qualcosa in un array [i] [j]. (Se è quello che stai cercando)

+0

Non penso che questo sia qualcosa che puoi fare in C# senza l'uso di librerie esterne, giusto? – user1306322

+0

Non ho più il codice originale di quel progetto in giro ho paura, quindi non potevo dirlo dall'alto. – Matthias

+15

Non puoi farlo in C# perché il codice è un esempio Java :) – Patrick