2012-04-12 10 views
17

Ich machte einen 2d Map Editor für mein quadratisches Kacheln Platformer Spiel, als ich erkannte, dass ich wirklich einen Bildeditor mit seinen Fähigkeiten benutzen konnte, benachbarte Pixel und viele mehr neu zu streichen, also dachte ich, ich sollte versuchen, ein gemaltes Level zu lesen App, die es dann in ein Leichtgewicht Format umwandeln wird.Wie kann ich Bildpixelwerte als RGB in 2D-Array lesen?

Ich bin mir nicht sicher, ob die Verwendung eines Bitmap-Formats für so etwas erforderlich ist, aber ich denke, das Lesen eines bestimmten Pixels wäre einfacher als beispielsweise mit PNG.

Also mein Ziel ist es, ein Bild zu öffnen, durch jedes Pixel zu iterieren, nach den Farben zu suchen, die zu meinem Kachelschema passen, und entsprechende Kacheln in das Array von Blöcken zu legen.

Hinweis: Ich habe bereits mein Lightweight-Format, also brauche ich nur Pixelwerte in Array zu lesen.


Lösung: Meine Skizze sieht wie folgt aus:

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


Beispiel 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

Randnotiz: Schalter/Fall auf Strings hat keinen Wert. Intern ist es nur String-Vergleiche. Der Vergleich der tatsächlichen RGB-Werte ist zwangsläufig effizienter. – Nyerguds

+0

@ Nyerguds das war vor Jahren, also erinnere ich mich nicht, warum ich es so gemacht habe. Ich bin sicher, es gibt einen viel besseren Weg, um alles in dieser Frage zu tun, und wenn ich heute das Problem lösen müsste, das ich heute hatte, wäre der Code völlig anders. – user1306322

+0

Hehe. Das ist die Art und Weise, wie es normalerweise aussieht, wenn ich auf alten Code zurückschaue, denke ich :) – Nyerguds

Antwort

31

Nun, wenn ich richtig verstanden habe, möchten Sie die Pixel im Bild durchlaufen, eine Art von Test durchführen, und wenn es passiert, möchten Sie dieses Pixel speichern eine Anordnung. So können Sie das tun:

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** 
     } 
    } 
} 

Ich glaube nicht, dass Sie noch etwas brauchen. Wenn Sie die spezifischen RGB-Werte benötigen, können Sie sie von den entsprechenden Methoden im Pixelobjekt abrufen.

+0

Haha, das ist genau das, was ich gerade gefunden habe :) – user1306322

+2

Für alle, die sich wundern, um ein RGB-Byte-Array zu erstellen, würden Sie etwas wie verwenden: 'int offset = y * bitmap.Width * 3 + x * 3; rgbBytes [Offset + 0] = Pixel.R; rgbBytes [offset + 1] = pixel.G; rgbBytes [offset + 2] = pixel.B; 'Beachten Sie, wie die Koordinaten' x' und 'y' eine häufige Quelle der Verwirrung sind (x ist die Spalte und y ist die Zeile). Sollte offensichtlich sein, wie man dies an RGBA, BGR usw. anpasst – Kat

-1

Ich glaube, ich einmal etwas Ähnliches getan haben. Hier ist ein Code-Snippet, was ich tat:

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

In der inneren Schleife für Sie etwas in ein Array stellen kann [i] [j]. (Wenn Sie das suchen)

+0

Ich glaube nicht, dass das etwas ist, das man in C# ohne die Verwendung von externen Bibliotheken tun kann, habe ich recht? – user1306322

+0

Ich habe den ursprünglichen Code aus diesem Projekt nicht mehr herumliegen. Ich habe Angst, also konnte ich das nicht von ganz oben sagen. – Matthias

+15

Sie können dies nicht in C# tun, weil der Code ein Java-Beispiel ist :) – Patrick