/// <summary> /// Reads the <see cref="BmpInfoHeader"/> from the stream. /// </summary> private void ReadInfoHeader() { #if NETCOREAPP2_1 Span <byte> buffer = stackalloc byte[BmpInfoHeader.MaxHeaderSize]; #else byte[] buffer = new byte[BmpInfoHeader.MaxHeaderSize]; #endif this.stream.Read(buffer, 0, BmpInfoHeader.HeaderSizeSize); // read the header size int headerSize = BinaryPrimitives.ReadInt32LittleEndian(buffer); if (headerSize < BmpInfoHeader.CoreSize) { throw new NotSupportedException($"ImageSharp does not support this BMP file. HeaderSize: {headerSize}."); } int skipAmount = 0; if (headerSize > BmpInfoHeader.MaxHeaderSize) { skipAmount = headerSize - BmpInfoHeader.MaxHeaderSize; headerSize = BmpInfoHeader.MaxHeaderSize; } // read the rest of the header this.stream.Read(buffer, BmpInfoHeader.HeaderSizeSize, headerSize - BmpInfoHeader.HeaderSizeSize); if (headerSize == BmpInfoHeader.CoreSize) { // 12 bytes this.infoHeader = BmpInfoHeader.ParseCore(buffer); } else if (headerSize >= BmpInfoHeader.Size) { // >= 40 bytes this.infoHeader = BmpInfoHeader.Parse(buffer); } else { throw new NotSupportedException($"ImageSharp does not support this BMP file. HeaderSize: {headerSize}."); } // Resolution is stored in PPM. var meta = new ImageMetaData(); meta.ResolutionUnits = PixelResolutionUnit.PixelsPerMeter; if (this.infoHeader.XPelsPerMeter > 0 && this.infoHeader.YPelsPerMeter > 0) { meta.HorizontalResolution = this.infoHeader.XPelsPerMeter; meta.VerticalResolution = this.infoHeader.YPelsPerMeter; } else { // Convert default metadata values to PPM. meta.HorizontalResolution = Math.Round(UnitConverter.InchToMeter(ImageMetaData.DefaultHorizontalResolution)); meta.VerticalResolution = Math.Round(UnitConverter.InchToMeter(ImageMetaData.DefaultVerticalResolution)); } this.metaData = meta; // skip the remaining header because we can't read those parts this.stream.Skip(skipAmount); }
/// <summary> /// Reads the <see cref="BmpInfoHeader"/> from the stream. /// </summary> private void ReadInfoHeader() { #if NETCOREAPP2_1 Span <byte> buffer = stackalloc byte[BmpInfoHeader.MaxHeaderSize]; #else byte[] buffer = new byte[BmpInfoHeader.MaxHeaderSize]; #endif this.stream.Read(buffer, 0, BmpInfoHeader.HeaderSizeSize); // read the header size int headerSize = BinaryPrimitives.ReadInt32LittleEndian(buffer); if (headerSize < BmpInfoHeader.CoreSize) { throw new NotSupportedException($"ImageSharp does not support this BMP file. HeaderSize: {headerSize}."); } int skipAmount = 0; if (headerSize > BmpInfoHeader.MaxHeaderSize) { skipAmount = headerSize - BmpInfoHeader.MaxHeaderSize; headerSize = BmpInfoHeader.MaxHeaderSize; } // read the rest of the header this.stream.Read(buffer, BmpInfoHeader.HeaderSizeSize, headerSize - BmpInfoHeader.HeaderSizeSize); if (headerSize == BmpInfoHeader.CoreSize) { // 12 bytes this.infoHeader = BmpInfoHeader.ParseCore(buffer); } else if (headerSize >= BmpInfoHeader.Size) { // >= 40 bytes this.infoHeader = BmpInfoHeader.Parse(buffer); } else { throw new NotSupportedException($"ImageSharp does not support this BMP file. HeaderSize: {headerSize}."); } // skip the remaining header because we can't read those parts this.stream.Skip(skipAmount); }
/// <summary> /// Reads the <see cref="BmpInfoHeader"/> from the stream. /// </summary> private void ReadInfoHeader() { byte[] buffer = new byte[BmpInfoHeader.MaxHeaderSize]; // read header size this.stream.Read(buffer, 0, BmpInfoHeader.HeaderSizeSize); int headerSize = BitConverter.ToInt32(buffer, 0); if (headerSize < BmpInfoHeader.CoreSize) { throw new NotSupportedException($"ImageSharp does not support this BMP file. HeaderSize: {headerSize}."); } int skipAmount = 0; if (headerSize > BmpInfoHeader.MaxHeaderSize) { skipAmount = headerSize - BmpInfoHeader.MaxHeaderSize; headerSize = BmpInfoHeader.MaxHeaderSize; } // read the rest of the header this.stream.Read(buffer, BmpInfoHeader.HeaderSizeSize, headerSize - BmpInfoHeader.HeaderSizeSize); if (headerSize == BmpInfoHeader.CoreSize) { // 12 bytes this.infoHeader = BmpInfoHeader.ParseCore(buffer); } else if (headerSize >= BmpInfoHeader.Size) { // >= 40 bytes this.infoHeader = BmpInfoHeader.Parse(buffer.AsSpan(0, 40)); } else { throw new NotSupportedException($"ImageSharp does not support this BMP file. HeaderSize: {headerSize}."); } // skip the remaining header because we can't read those parts this.stream.Skip(skipAmount); }