Example #1
0
        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);
        }
Example #2
0
        /// <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;
            }
        }