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 )