2012-04-12 36 views
17

Tôi đã tạo một trình chỉnh sửa bản đồ 2d cho trò chơi platformer hình vuông của mình, khi tôi nhận ra mình có thể sử dụng trình chỉnh sửa hình ảnh với khả năng vẽ lại các pixel liền kề và nhiều hơn nữa, vì vậy tôi đã thử đọc ứng dụng sau đó sẽ chuyển đổi nó thành định dạng lightweigh.Làm thế nào tôi có thể đọc các giá trị của pixel ảnh dưới dạng RGB thành mảng 2d?

Tôi không chắc chắn nếu sử dụng định dạng bitmap là bắt buộc đối với điều đó, nhưng tôi đoán, việc đọc một pixel cụ thể sẽ dễ dàng hơn so với PNG chẳng hạn.

Vì vậy, mục tiêu của tôi là mở một hình ảnh, lặp qua từng pixel, tìm những màu phù hợp với sơ đồ khối của tôi và đặt lát tương ứng vào mảng khối.

Lưu ý: Tôi đã có định dạng lightweigh, vì vậy tôi chỉ cần đọc giá trị pixel vào mảng.


Giải pháp: phác thảo của tôi trông như thế này:

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


Ví dụ 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

Lưu ý phụ: chuyển/trường hợp trên chuỗi không có giá trị. Bên trong nó chỉ là so sánh chuỗi. Chỉ cần so sánh các giá trị RGB thực tế là ràng buộc để tải được hiệu quả hơn. – Nyerguds

+0

@Nyerguds đây là những năm trước vì vậy tôi không nhớ tại sao tôi đã làm theo cách đó. Tôi chắc chắn có một cách tốt hơn để làm mọi thứ trong câu hỏi này, và nếu tôi phải giải quyết bất cứ vấn đề gì tôi đã có trở lại thì hôm nay, mã sẽ hoàn toàn khác. – user1306322

+0

Hehe. Đó là cách nó thường đi khi nhìn lại mã cũ, tôi đoán :) – Nyerguds

Trả lời

31

Vâng, nếu tôi hiểu chính xác, bạn muốn lặp qua các pixel trong hình ảnh, thực hiện một số loại kiểm tra và nếu nó vượt qua, bạn muốn lưu trữ pixel đó một mảng. Dưới đây là cách bạn có thể làm điều đó:

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

Đừng nghĩ bạn cần bất cứ điều gì khác. Nếu bạn cần các giá trị RGB cụ thể, bạn có thể lấy chúng từ các phương thức tương ứng trong đối tượng pixel.

+0

Haha, đây chính xác là những gì tôi vừa đưa ra :) – user1306322

+2

Đối với bất cứ ai tự hỏi, để tạo một mảng byte RGB, bạn sẽ sử dụng một cái gì đó như: 'int offset = y * bitmap.Width * 3 + x * 3; rgbBytes [offset + 0] = pixel.R; rgbBytes [offset + 1] = pixel.G; rgbBytes [offset + 2] = pixel.B; 'Lưu ý cách tọa độ' x' và 'y' là một nguồn gây nhầm lẫn chung (x là cột và y là hàng). Nên rõ ràng làm thế nào để thích ứng với điều này để làm việc cho RGBA, BGR, vv – Kat

-1

Tôi nghĩ rằng tôi đã làm điều gì đó tương tự một lần. Dưới đây là một đoạn mã của những gì tôi đã làm:

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

Trong khu vực nội cho vòng lặp bạn có thể đặt một cái gì đó vào một mảng [i] [j]. (Nếu đó là những gì bạn đang tìm kiếm)

+0

Tôi không nghĩ rằng đây là một cái gì đó bạn có thể làm trong C# mà không cần sử dụng các thư viện bên ngoài, tôi có phải không? – user1306322

+0

Tôi không có mã ban đầu từ dự án đó nằm xung quanh nữa Tôi sợ, vì vậy tôi không thể nói điều đó từ đỉnh đầu của tôi. – Matthias

+15

Bạn không thể làm điều này trong C# vì mã là một ví dụ Java :) – Patrick

Các vấn đề liên quan