|
|
|
@ -130,6 +130,13 @@ internal sealed class BmpDecoderCore : ImageDecoderCore |
|
|
|
Image<TPixel>? image = null; |
|
|
|
try |
|
|
|
{ |
|
|
|
ushort bitsPerPixel = this.infoHeader.BitsPerPixel; |
|
|
|
|
|
|
|
if (bitsPerPixel is not (1 or 2 or 4 or 8 or 16 or 24 or 32)) |
|
|
|
{ |
|
|
|
BmpThrowHelper.ThrowInvalidImageContentException($"Invalid bits per pixel: {bitsPerPixel}"); |
|
|
|
} |
|
|
|
|
|
|
|
int bytesPerColorMapEntry = this.ReadImageHeaders(stream, out bool inverted, out byte[] palette); |
|
|
|
|
|
|
|
image = new Image<TPixel>(this.configuration, this.infoHeader.Width, this.infoHeader.Height, this.metadata); |
|
|
|
@ -138,23 +145,23 @@ internal sealed class BmpDecoderCore : ImageDecoderCore |
|
|
|
|
|
|
|
switch (this.infoHeader.Compression) |
|
|
|
{ |
|
|
|
case BmpCompression.RGB when this.infoHeader.BitsPerPixel is 32 && this.bmpMetadata.InfoHeaderType is BmpInfoHeaderType.WinVersion3: |
|
|
|
case BmpCompression.RGB when bitsPerPixel is 32 && this.bmpMetadata.InfoHeaderType is BmpInfoHeaderType.WinVersion3: |
|
|
|
this.ReadRgb32Slow(stream, pixels, this.infoHeader.Width, this.infoHeader.Height, inverted); |
|
|
|
|
|
|
|
break; |
|
|
|
case BmpCompression.RGB when this.infoHeader.BitsPerPixel is 32: |
|
|
|
case BmpCompression.RGB when bitsPerPixel is 32: |
|
|
|
this.ReadRgb32Fast(stream, pixels, this.infoHeader.Width, this.infoHeader.Height, inverted); |
|
|
|
|
|
|
|
break; |
|
|
|
case BmpCompression.RGB when this.infoHeader.BitsPerPixel is 24: |
|
|
|
case BmpCompression.RGB when bitsPerPixel is 24: |
|
|
|
this.ReadRgb24(stream, pixels, this.infoHeader.Width, this.infoHeader.Height, inverted); |
|
|
|
|
|
|
|
break; |
|
|
|
case BmpCompression.RGB when this.infoHeader.BitsPerPixel is 16: |
|
|
|
case BmpCompression.RGB when bitsPerPixel is 16: |
|
|
|
this.ReadRgb16(stream, pixels, this.infoHeader.Width, this.infoHeader.Height, inverted); |
|
|
|
|
|
|
|
break; |
|
|
|
case BmpCompression.RGB when this.infoHeader.BitsPerPixel is <= 8 && this.processedAlphaMask: |
|
|
|
case BmpCompression.RGB when bitsPerPixel is <= 8 && this.processedAlphaMask: |
|
|
|
this.ReadRgbPaletteWithAlphaMask( |
|
|
|
stream, |
|
|
|
pixels, |
|
|
|
@ -166,7 +173,7 @@ internal sealed class BmpDecoderCore : ImageDecoderCore |
|
|
|
inverted); |
|
|
|
|
|
|
|
break; |
|
|
|
case BmpCompression.RGB when this.infoHeader.BitsPerPixel is <= 8: |
|
|
|
case BmpCompression.RGB when bitsPerPixel is <= 8: |
|
|
|
this.ReadRgbPalette( |
|
|
|
stream, |
|
|
|
pixels, |
|
|
|
|