Подтвердить что ты не робот

Как я могу считывать значения пикселей изображения как RGB в 2d-массив?

Я делал 2-й редактор карт для своей платформы с платформой квадратного плит, когда понял, что могу реально использовать редактор изображений с его способностями перерисовывать соседние пиксели и многое другое, поэтому я решил, что должен попробовать и прочитать окрашенный уровень приложение, которое затем преобразует его в формат lightweigh.

Я не уверен, что использование формата растрового изображения является обязательным для такой вещи, но, я думаю, чтение определенного пикселя было бы проще, чем при использовании PNG.

Итак, моя цель - открыть изображение, прорежировать каждый пиксель, искать те, которые соответствуют моей схеме плитки, и поместить соответствующую плитку в массив блоков.

Примечание. У меня уже есть формат lightweigh, поэтому мне нужно только считывать значения пикселей в массив.

<ч/" > Решение: Мой эскиз выглядит следующим образом:

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

<ч/" > Пример 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;
                            }
                    }
                }
            }
4b9b3361

Ответ 1

Хорошо, если я правильно понял, вы хотите перебирать пиксели в изображении, выполнять какой-то тест, и если он пройдет, вы хотите сохранить этот пиксель в массиве. Вот как вы могли это сделать:

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

Не думай, что тебе нужно что-нибудь еще. Если вам нужны конкретные значения RGB, вы можете получить их из соответствующих методов в пиксельном объекте.

Ответ 2

Я думаю, что однажды сделал что-то подобное. Вот фрагмент кода того, что я делал:

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

В цикле inner for вы можете поместить что-то в массив [i] [j]. (Если это то, что вы ищете)