2012-04-12 14 views
17

Kare kiremit platform oyunu için 2d harita editörüyordum, bir resim editörünü yan yana pikselleri yeniden boyamak için yetenekleri olan bir resim editörü kullanabileceğimi fark ettim ve bu yüzden bir boyalı seviye okumayı denemeliyim. Daha sonra onu bir lightweigh formatına dönüştürecek olan uygulama.Görüntü piksellerinin değerlerini RGB olarak 2d dizisine nasıl okuyabilirim?

Böyle bir şey için bir bitmap biçimi kullanmanın zorunlu olup olmadığından emin değilim, ancak belirli bir pikseli okumak örneğin PNG'den daha kolay olurdu.

Bu nedenle amacım bir görüntü açmak, her pikselde yinelemek, döşeme düzenime uyan renklerin aramasını ve ilgili döşeme bloğunu blok dizisine yerleştirmektir.

Not: Işığım ilerletme formatım zaten var, bu yüzden piksel değerlerini yalnızca diziye okumaya ihtiyacım var.


Çözüm: Benim kroki şöyle görünür:

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


Örnek 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

Yan not: Dizelerdeki anahtar/kasa değeri yoktur. Dahili olarak sadece dizi karşılaştırır. Sadece gerçek RGB değerlerini karşılaştırmak, yüklerin daha verimli olmasına bağlıdır. – Nyerguds

+0

@Nyerguds bu yıllar önceydi, bu yüzden neden böyle yaptığımı hatırlamıyorum. Eminim bu konuda herşeyi yapmanın çok daha iyi bir yolu vardır, ve bugün yaptığım her türlü sorunu çözmem gerekirse, kod tamamen farklı olurdu. – user1306322

+0

Hehe. Eski kodlara baktığımızda genellikle bu şekilde gidiyor, sanırım :) – Nyerguds

cevap

31

Doğru anlaşılmış olsaydım, görüntüdeki pikselleri yinelemek, bir tür test yapmak istersiniz ve eğer geçerse o pikseli saklamak istersiniz. bir dizi. Bunu nasıl yapabilirdiniz:

Başka bir şeye ihtiyacınız olduğunu düşünmeyin. Belirli RGB değerlerine ihtiyacınız varsa, bunları piksel nesnesindeki ilgili yöntemlerden alabilirsiniz.

+0

Haha, bu tam olarak geldiğim şeydi :) – user1306322

+2

Bir RGB bayt dizisi oluşturmayı merak edenler için, şöyle bir şey kullanırsınız: int ofset = y * bitmap.Width * 3 + x * 3; rgbBytes [ofset + 0] = piksel.R; rgbBytes [offset + 1] = pixel.G; rgbBytes [offset + 2] = pixel.B; 'x' ve' y' koordinatlarının ortak bir karışıklık kaynağı olduğunu unutmayın (x, sütun ve y satırdır). Bunu RGBA, BGR vb. Için çalışmaya nasıl uyarlayacağınız açık olmalıdır. – Kat

-1

Bir zamanlar benzer bir şey yaptık düşünüyorum. Bir dizide [i] [j] içine bir şey koyabilirsiniz döngü iç in

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

: İşte ne yaptığını bir kod parçacığı var. (Eğer aradığınız buysa)

+0

Bunun C# programında yapabileceğiniz bir şey olduğunu düşünmüyorum. – user1306322

+0

Artık o projeden orjinal kodum yok korkuyorum, bu yüzden bunu başımın tepesinden anlayamadım. – Matthias

+15

Bunu C# içinde yapamazsınız çünkü kod bir Java örneğidir :) – Patrick

İlgili konular