private static BitmapV5Header FillBitmapHeader(BinaryReader rdr, DibClass cls) { // I'm assuming that BitmapCore bitmaps use RGB encoding without compression var v5 = new BitmapV5Header { bV5Compression = BiCompression.BiRgb }; var isCore = cls == DibClass.Core; v5.bV5Size = rdr.ReadUInt32(); v5.bV5Width = isCore ? rdr.ReadUInt16() : rdr.ReadInt32(); v5.bV5Height = isCore ? rdr.ReadUInt16() : rdr.ReadInt32(); v5.bV5Planes = rdr.ReadUInt16(); v5.bV5BitCount = rdr.ReadUInt16(); if (cls == DibClass.Core) { return(v5); } v5.bV5Compression = (BiCompression)rdr.ReadUInt32(); v5.bV5SizeImage = rdr.ReadUInt32(); v5.bV5XPelsPerMeter = rdr.ReadInt32(); v5.bV5YPelsPerMeter = rdr.ReadInt32(); v5.bV5ClrUsed = rdr.ReadUInt32(); v5.bV5ClrImportant = rdr.ReadUInt32(); if (cls == DibClass.V3) { return(v5); } v5.bV5RedMask = rdr.ReadUInt32(); v5.bV5GreenMask = rdr.ReadUInt32(); v5.bV5BlueMask = rdr.ReadUInt32(); v5.bV5AlphaMask = rdr.ReadUInt32(); v5.bV5CSType = rdr.ReadUInt32(); v5.bV5Endpoints = new CieXyzTriple(rdr); v5.bV5GammaRed = rdr.ReadUInt32(); v5.bV5GammaGreen = rdr.ReadUInt32(); v5.bV5GammaBlue = rdr.ReadUInt32(); if (cls == DibClass.V4) { return(v5); } v5.bV5Intent = rdr.ReadUInt32(); v5.bV5ProfileData = rdr.ReadUInt32(); v5.bV5ProfileSize = rdr.ReadUInt32(); v5.bV5Reserved = rdr.ReadUInt32(); return(v5); }
/// <summary>Reads header information from a stream.</summary> private void Initialise(Stream stream) { BinaryReader rdr; int first; try { rdr = new BinaryReader(stream); first = rdr.PeekChar(); } catch (ArgumentException aex) { throw new DibException("Unable to initialise DIB", aex); } // see if it has a BitmapFileHeader at the beginning if (first == 'B') { _fileHeader = new BitmapFileHeader(rdr); } // determine the Dib type (the BitmapFileHeader will have advanced the reader) // maybe do some validation on the structs? switch (rdr.PeekChar()) { case 12: Class = DibClass.Core; break; case 40: Class = DibClass.V3; break; case 108: Class = DibClass.V4; break; case 124: Class = DibClass.V5; break; default: throw new DibException("Unrecognised BitmapInfoHeader dwSize"); } _infoHeader = FillBitmapHeader(rdr, Class); if (_fileHeader.bfType == 0) { // if no fileheader was read earlier // create the FileHeader _fileHeader = CreateFileHeader(); } else { // resize the data array to remove the fileheader var sizeOfBitmapFileHeader = Marshal.SizeOf(typeof(BitmapFileHeader)); var newData = new byte[_dibData.Length - sizeOfBitmapFileHeader]; Array.Copy(_dibData, sizeOfBitmapFileHeader, newData, 0, newData.Length); _dibData = newData; } }