Como posso ler os valores dos pixels da imagem como RGB na matriz 2D?

Eu estava fazendo um editor de mapa 2d para o meu jogo de plataformas, quando percebi que realmente poderia usar um editor de imagem com suas habilidades para redesenhar pixels adjacentes e muito mais, então imaginei que deveria tentar ler um nível pintado por um aplicativo que irá convertê-lo em um formato lightweigh.

Eu não tenho certeza se o uso de um formato de bitmap é obrigatório para tal coisa, mas eu acho que, lendo um pixel específico seria mais fácil do que com PNG por exemplo.

Portanto, meu objective é abrir uma imagem, percorrer cada pixel, procurar aquelas que se encheckboxm no esquema de blocos e colocar o bloco correspondente na matriz de blocos.

Nota: Eu já tenho o meu formato lightweigh, então eu preciso ler apenas valores de pixels em array.


Solução: meu esboço é assim:

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

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

Bem, se eu entendi corretamente, você deseja iterar através dos pixels na imagem, realizar algum tipo de teste e, se for aprovado, você deseja armazenar esse pixel em uma matriz. Veja como você pode fazer isso:

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

Não pense que você precisa de mais nada. Se você precisar dos valores RGB específicos, poderá obtê-los dos methods correspondentes no object de pixel.

  public Color[][] getBitmapColorMatrix(string filePath) { Bitmap bmp = new Bitmap(filePath); Color[][] matrix; int height = bmp.Height; int width = bmp.Width; if (height > width) { matrix = new Color[bmp.Width][]; for (int i = 0; i <= bmp.Width - 1; i++) { matrix[i] = new Color[bmp.Height]; for (int j = 0; j < bmp.Height - 1; j++) { matrix[i][j] = bmp.GetPixel(i, j); } } } else { matrix = new Color[bmp.Height][]; for (int i = 0; i <= bmp.Height - 1; i++) { matrix[i] = new Color[bmp.Width]; for (int j = 0; j < bmp.Width - 1; j++) { matrix[i][j] = bmp.GetPixel(i, j); } } } return matrix; } 

Eu acho que fiz algo parecido uma vez. Aqui está um trecho de código do que eu estava fazendo:

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

No loop interno, você pode colocar algo em um array [i] [j]. (Se é isso que você está procurando)