Благодаря Джими и Ушедшим в отставку ниндзя я смог выяснить, как получить ширину / высоту из файла PNG.
На самом деле все очень просто. PNG-файлы имеют очень четко определенную структуру, на что указывает здесь Отставной ниндзя).
Я ищу ширину и высоту изображения, которые появляются в виде «кусочка» после 8- длинный байт заголовка. Так как я точно знаю, что мой формат изображения будет PNG и что файл действителен, я могу пропустить все проверки и проверки и перейти непосредственно к самим данным: ширина в байтах 16 - 20 и высота в 20 - 24 (байты 8 - 12 - это имя чанка, IHDR - особый тип чанка, а 12 - 16 - длина чанка; 0, вероятно, потому что это особый чанк фиксированного размера). Я бы порекомендовал проверить страницу википедии, на которую ссылались выше, чтобы понять, как работает формат, это действительно очень просто. Я также открыл один из своих файлов PNG в шестнадцатеричном редакторе, чтобы сравнить реальный пример с форматом PNG, как описано в википедии, чтобы облегчить его понимание.
Таким образом, я смог заставить его работать должным образом с этим кодом:
public Size GetImageSize(string Filename)
{
BinaryReader br = new BinaryReader(File.OpenRead(Filename));
br.BaseStream.Position = 16;
byte[] widthbytes = new byte[sizeof(int)];
for (int i = 0; i < sizeof(int); i++) widthbytes[sizeof(int) - 1 - i ] = br.ReadByte();
int width = BitConverter.ToInt32(widthbytes, 0);
byte[] heightbytes = new byte[sizeof(int)];
for (int i = 0; i < sizeof(int); i++) heightbytes[sizeof(int) - 1 - i] = br.ReadByte();
int height = BitConverter.ToInt32(heightbytes, 0);
return new Size(width, height);
}