/// <summary>
        /// Create default indexed bitmap with palette.
        /// </summary>
        public BitmapFile(ushort bitCount, uint width, int height, Color[] palette) : this(bitCount, width, height)
        {
            if (palette.Length > 1 << bitCount)
            {
                throw new System.Exception("Unable to create bitmap. Provided palette length is greater than provided bit count.");
            }

            // Expand palette, if needed
            int maxSize = ImageHeader.CalcMaxIndexedPaletteSize(bitCount);

            if (palette.Length != maxSize)
            {
                Color[] newPalette = new Color[maxSize];
                System.Array.Copy(palette, newPalette, palette.Length < newPalette.Length ? palette.Length : newPalette.Length);

                palette = newPalette;
            }

            // Create headers
            int pixelOffset = BmpHeader.SizeInBytes + ImageHeader.SizeInBytes + palette.Length * Color.SizeInBytes;
            int fileSize    = pixelOffset + ImageHeader.CalculatePitch(bitCount, (int)width) * System.Math.Abs(height);

            bmpHeader   = BmpHeader.Create((uint)fileSize, (uint)pixelOffset);
            imageHeader = ImageHeader.Create((int)width, height, bitCount);

            // Store data
            this.palette = palette;
        }
        // Write
        private static void WriteHeaders(BinaryWriter seekableWriter, ushort bitCount, int width, int height, Color[] palette)
        {
            int pixelOffset = BmpHeader.SizeInBytes + ImageHeader.SizeInBytes + palette.Length * Color.SizeInBytes;
            int fileSize    = pixelOffset + ImageHeader.CalculatePitch(bitCount, width) * System.Math.Abs(height);

            //if (fileSize > uint.MaxValue) {
            //	throw new System.Exception("Bitmap size is too large to save to disk.");
            //}

            BmpHeader   bmpHeader   = BmpHeader.Create((uint)fileSize, (uint)pixelOffset);
            ImageHeader imageHeader = ImageHeader.Create(width, height, bitCount);

            bmpHeader.Serialize(seekableWriter);
            imageHeader.Serialize(seekableWriter);
        }
        /// <summary>
        /// Create default indexed bitmap.
        /// </summary>
        public BitmapFile(ushort bitCount, uint width, int height)
        {
            VerifyIndexedImageForSerialization(bitCount);

            // Create headers and default palette
            imageHeader = ImageHeader.Create((int)width, (int)height, bitCount);
            palette     = new Color[imageHeader.CalcMaxIndexedPaletteSize()];
            pixels      = new byte[imageHeader.CalculatePitch() * System.Math.Abs(height)];

            int pixelOffset    = BmpHeader.SizeInBytes + ImageHeader.SizeInBytes + palette.Length * Color.SizeInBytes;
            int bitmapFileSize = pixelOffset + pixels.Length * sizeof(byte);

            //if (bitmapFileSize > uint.MaxValue) {
            //	throw new System.Exception("Maximum size of a bitmap file has been exceeded");
            //}

            bmpHeader = BmpHeader.Create((uint)bitmapFileSize, (uint)pixelOffset);
        }