Получение значений цвета пикселей из байтового массива - PullRequest
0 голосов
/ 02 ноября 2018

Я до сих пор мало работал с образами в C #, и меня смущают значения, которые я получаю в своем байтовом массиве imageData при передаче его в формате 15x15 png. Я ожидал бы, что будет 225 элементов массива (или больше, поскольку каждый пиксель будет иметь значение r, g, b,?), Однако он имеет только 124.

Какие 124 элемента я получаю? Кроме того, я хотел бы иметь возможность определить цвет каждого пикселя. Возможно ли это сделать на основе данных, приведенных в байтовом массиве, или существует более лучший способ сделать это в C #?

Спасибо

        Console.Write("Input file: ");
        string fileName = Console.ReadLine();
        Console.Write("Output file: ");
        string outputFileName = Console.ReadLine();

        FileInfo fileInfo = new FileInfo(Path.Combine(Environment.CurrentDirectory, fileName));

        byte[] imageData = new byte[fileInfo.Length];

        using (FileStream fs = fileInfo.OpenRead())
        {
            fs.Read(imageData, 0, imageData.Length);
        }

1 Ответ

0 голосов
/ 02 ноября 2018

PNG-файлы на самом деле довольно сложны, и я бы не рекомендовал пытаться читать их, не используя для этого специализированную библиотеку. Причина, по которой вы получаете меньше байтов, чем ожидаете, заключается в том, что информация сжата и должна быть распакована, чтобы получить доступ к полной информации. Кроме того, формат PNG сложнее, чем просто список значений цвета на пиксель.

Я бы порекомендовал две вещи:

1) Вы можете просмотреть полную спецификацию PNG здесь: https://www.w3.org/TR/2003/REC-PNG-20031110/

Он очень подробно объяснит все шаги, необходимые для понимания файла PNG, и, возможно, убедит вас в том, что было бы лучше использовать библиотеку или встроенные функции для обработки файлов из-за большого объема работы. .

2) Вместо этого рассмотрите возможность работы с растровыми изображениями, если вы действительно хотите получить низкоуровневое представление изображений. Это гораздо более простой формат, для которого было бы проще написать свои собственные парсеры. В противном случае вам просто нужно использовать чужой код для управления загрузкой файлов PNG. Вы можете найти информацию о формате BMP здесь: https://docs.microsoft.com/en-us/windows/desktop/gdi/bitmap-storage

Что касается других методов загрузки файлов, переполнение стека поиска для загрузки изображений в C #, существует множество других тем (например, Чтение файла изображения PNG в .Net 2.0 )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...