I'm trying to read in just the first part of a .png file to peek at it's width and height without loading in the whole file. I'm using FreeImage for reading the whole file but since it doesn't have a function to let me peek at the image size before loading it all in I'm rolling my own.

I've gotten as a far as reading in the first 16 bytes which includes an 8 byte signature, then the length and type of the first chunk:

struct Header {
    ubyte[8] signature;
    uint length;
    char[4] type;
}
union Un {
    Header h;
    ubyte[16] u;
}

auto f = File(path, "r");
foreach (ubyte[] buffer; f.byChunk(16)){
    Un fff;
    fff.u = buffer[0..16];
    writeln(fff.h);
    break;
}

It prints out:
Header([137, 80, 78, 71, 13, 10, 26, 10], 218103808, "IHDR")

The signature is correct, the type is correct, but the value I get for length should be 13, not 218103808. So I'm guessing my ubytes are in the wrong order in the uint... how should I put them around the correct way so that my code won't break on another machine with different endianness?

Reply via email to