diff --git a/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs b/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs
index ef3ca24ee8..f6eb78ea9d 100644
--- a/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs
+++ b/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs
@@ -510,6 +510,11 @@ namespace SixLabors.ImageSharp.Formats.Bmp
// 12 bytes
this.infoHeader = BmpInfoHeader.ParseCore(buffer);
}
+ else if (headerSize == BmpInfoHeader.Os2Short)
+ {
+ // 16 bytes
+ this.infoHeader = BmpInfoHeader.ParseOs2Short(buffer);
+ }
else if (headerSize >= BmpInfoHeader.Size)
{
// >= 40 bytes
diff --git a/src/ImageSharp/Formats/Bmp/BmpInfoHeader.cs b/src/ImageSharp/Formats/Bmp/BmpInfoHeader.cs
index 4dd63a9626..a32f806a94 100644
--- a/src/ImageSharp/Formats/Bmp/BmpInfoHeader.cs
+++ b/src/ImageSharp/Formats/Bmp/BmpInfoHeader.cs
@@ -26,6 +26,11 @@ namespace SixLabors.ImageSharp.Formats.Bmp
///
public const int CoreSize = 12;
+ ///
+ /// Defines the size of the short variant of the OS22XBITMAPHEADER data structure in the bitmap file.
+ ///
+ public const int Os2Short = 16;
+
///
/// Defines the size of the biggest supported header data structure in the bitmap file.
///
@@ -143,7 +148,7 @@ namespace SixLabors.ImageSharp.Formats.Bmp
///
/// Parses the BITMAPCOREHEADER consisting of the headerSize, width, height, planes, and bitsPerPixel fields (12 bytes).
///
- /// The data to parse,
+ /// The data to parse.
/// Parsed header
///
public static BmpInfoHeader ParseCore(ReadOnlySpan data)
@@ -156,6 +161,23 @@ namespace SixLabors.ImageSharp.Formats.Bmp
bitsPerPixel: BinaryPrimitives.ReadInt16LittleEndian(data.Slice(10, 2)));
}
+ ///
+ /// Parses a short variant of the OS22XBITMAPHEADER. It is identical to the BITMAPCOREHEADER, except that the width and height
+ /// are 4 bytes instead of 2.
+ ///
+ /// The data to parse.
+ /// Parsed header
+ ///
+ public static BmpInfoHeader ParseOs2Short(ReadOnlySpan data)
+ {
+ return new BmpInfoHeader(
+ headerSize: BinaryPrimitives.ReadInt32LittleEndian(data.Slice(0, 4)),
+ width: BinaryPrimitives.ReadInt32LittleEndian(data.Slice(4, 4)),
+ height: BinaryPrimitives.ReadInt32LittleEndian(data.Slice(8, 4)),
+ planes: BinaryPrimitives.ReadInt16LittleEndian(data.Slice(12, 2)),
+ bitsPerPixel: BinaryPrimitives.ReadInt16LittleEndian(data.Slice(14, 2)));
+ }
+
public unsafe void WriteTo(Span buffer)
{
ref BmpInfoHeader dest = ref Unsafe.As(ref MemoryMarshal.GetReference(buffer));