diff --git a/src/ImageSharp/Common/Helpers/EnumUtils.cs b/src/ImageSharp/Common/Helpers/EnumUtils.cs index d6bead640..a59841162 100644 --- a/src/ImageSharp/Common/Helpers/EnumUtils.cs +++ b/src/ImageSharp/Common/Helpers/EnumUtils.cs @@ -19,15 +19,14 @@ namespace SixLabors.ImageSharp /// The default value to return. /// The . public static TEnum Parse(int value, TEnum defaultValue) - where TEnum : Enum + where TEnum : struct, Enum { - foreach (TEnum enumValue in Enum.GetValues(typeof(TEnum))) + DebugGuard.IsTrue(Unsafe.SizeOf() == sizeof(int), "Only int-sized enums are supported."); + + TEnum valueEnum = Unsafe.As(ref value); + if (Enum.IsDefined(valueEnum)) { - TEnum current = enumValue; - if (value == Unsafe.As(ref current)) - { - return enumValue; - } + return valueEnum; } return defaultValue; @@ -41,8 +40,10 @@ namespace SixLabors.ImageSharp /// The flag. /// The . public static bool HasFlag(TEnum value, TEnum flag) - where TEnum : Enum + where TEnum : struct, Enum { + DebugGuard.IsTrue(Unsafe.SizeOf() == sizeof(int), "Only int-sized enums are supported."); + uint flagValue = Unsafe.As(ref flag); return (Unsafe.As(ref value) & flagValue) == flagValue; } diff --git a/src/ImageSharp/Formats/Tiff/TiffEncoderCore.cs b/src/ImageSharp/Formats/Tiff/TiffEncoderCore.cs index 27c449073..16071001d 100644 --- a/src/ImageSharp/Formats/Tiff/TiffEncoderCore.cs +++ b/src/ImageSharp/Formats/Tiff/TiffEncoderCore.cs @@ -417,6 +417,13 @@ namespace SixLabors.ImageSharp.Formats.Tiff return; case TiffPhotometricInterpretation.Rgb: + // Make sure 1 Bit compression is only used with 1 bit pixel type. + if (IsOneBitCompression(this.CompressionType)) + { + // Invalid compression / bits per pixel combination, fallback to no compression. + compression = DefaultCompression; + } + this.SetEncoderOptions(TiffBitsPerPixel.Bit24, photometricInterpretation, compression, predictor); return; }