From 586f8e5ee25186b5212d609c7ec840631efb2a2a Mon Sep 17 00:00:00 2001 From: Ildar Khayrutdinov Date: Sat, 6 Feb 2021 22:59:43 +0300 Subject: [PATCH] Report 1-bit mode bug. Enable test images. Change test files. --- .../Codecs/DecodeTiff.cs | 12 +++---- .../Codecs/EncodeTiff.cs | 18 +++++++--- tests/ImageSharp.Benchmarks/Config.cs | 2 +- .../Formats/Tiff/TiffEncoderTests.cs | 34 +++++++++++++++++++ 4 files changed, 54 insertions(+), 12 deletions(-) diff --git a/tests/ImageSharp.Benchmarks/Codecs/DecodeTiff.cs b/tests/ImageSharp.Benchmarks/Codecs/DecodeTiff.cs index fb506528f..44ffae1d9 100644 --- a/tests/ImageSharp.Benchmarks/Codecs/DecodeTiff.cs +++ b/tests/ImageSharp.Benchmarks/Codecs/DecodeTiff.cs @@ -53,12 +53,12 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs [Params( TestImages.Tiff.CcittFax3AllTermCodes, TestImages.Tiff.HuffmanRleAllMakeupCodes, - TestImages.Tiff.GrayscaleUncompressed, - TestImages.Tiff.PaletteUncompressed, - TestImages.Tiff.RgbDeflate, - TestImages.Tiff.RgbLzwPredictor, - TestImages.Tiff.RgbPackbits, - TestImages.Tiff.RgbUncompressed)] + TestImages.Tiff.Calliphora_GrayscaleUncompressed, + TestImages.Tiff.Calliphora_RgbPaletteLzw_Predictor, + TestImages.Tiff.Calliphora_RgbDeflate_Predictor, + TestImages.Tiff.Calliphora_RgbLzwPredictor, + TestImages.Tiff.Calliphora_RgbPackbits, + TestImages.Tiff.Calliphora_RgbUncompressed)] public string TestImage { get; set; } #endif diff --git a/tests/ImageSharp.Benchmarks/Codecs/EncodeTiff.cs b/tests/ImageSharp.Benchmarks/Codecs/EncodeTiff.cs index 8080b1607..e40907c8e 100644 --- a/tests/ImageSharp.Benchmarks/Codecs/EncodeTiff.cs +++ b/tests/ImageSharp.Benchmarks/Codecs/EncodeTiff.cs @@ -24,14 +24,14 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs private string TestImageFullPath => Path.Combine(TestEnvironment.InputImagesDirectoryFullPath, this.TestImage); - [Params(TestImages.Tiff.RgbUncompressed)] + [Params(TestImages.Tiff.Calliphora_RgbUncompressed)] public string TestImage { get; set; } [Params( TiffEncoderCompression.None, - ////TiffEncoderCompression.Deflate, + TiffEncoderCompression.Deflate, TiffEncoderCompression.Lzw, - ////TiffEncoderCompression.PackBits, + TiffEncoderCompression.PackBits, TiffEncoderCompression.CcittGroup3Fax, TiffEncoderCompression.ModifiedHuffman)] public TiffEncoderCompression Compression { get; set; } @@ -70,7 +70,15 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs [Benchmark(Description = "ImageSharp Tiff")] public void TiffCore() { - var encoder = new TiffEncoder() { Compression = this.Compression }; + TiffEncodingMode mode = TiffEncodingMode.Default; + + // workaround for 1-bit bug + if (this.Compression == TiffEncoderCompression.CcittGroup3Fax || this.Compression == TiffEncoderCompression.ModifiedHuffman) + { + mode = TiffEncodingMode.BiColor; + } + + var encoder = new TiffEncoder() { Compression = this.Compression, Mode = mode }; using var memoryStream = new MemoryStream(); this.core.SaveAsTiff(memoryStream, encoder); } @@ -107,7 +115,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs return EncoderValue.CompressionLZW; default: - throw new System.ArgumentOutOfRangeException(nameof(compression)); + throw new System.NotSupportedException(compression.ToString()); } } } diff --git a/tests/ImageSharp.Benchmarks/Config.cs b/tests/ImageSharp.Benchmarks/Config.cs index 16999ea7d..63064eec5 100644 --- a/tests/ImageSharp.Benchmarks/Config.cs +++ b/tests/ImageSharp.Benchmarks/Config.cs @@ -26,7 +26,7 @@ namespace SixLabors.ImageSharp.Benchmarks } #endif - this.SummaryStyle = SummaryStyle.Default.WithMaxParameterColumnWidth(40); + this.SummaryStyle = SummaryStyle.Default.WithMaxParameterColumnWidth(50); } public class MultiFramework : Config diff --git a/tests/ImageSharp.Tests/Formats/Tiff/TiffEncoderTests.cs b/tests/ImageSharp.Tests/Formats/Tiff/TiffEncoderTests.cs index fd4432c5e..7eaf735c9 100644 --- a/tests/ImageSharp.Tests/Formats/Tiff/TiffEncoderTests.cs +++ b/tests/ImageSharp.Tests/Formats/Tiff/TiffEncoderTests.cs @@ -90,6 +90,40 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff Assert.Equal(expectedBitsPerPixel, meta.BitsPerPixel); } + [Theory] + [WithFile(RgbUncompressed, PixelTypes.Rgba32, TiffEncoderCompression.CcittGroup3Fax, TiffCompression.CcittGroup3Fax)] + [WithFile(RgbUncompressed, PixelTypes.Rgba32, TiffEncoderCompression.ModifiedHuffman, TiffCompression.Ccitt1D)] + [WithFile(GrayscaleUncompressed, PixelTypes.L8, TiffEncoderCompression.CcittGroup3Fax, TiffCompression.CcittGroup3Fax)] + [WithFile(PaletteDeflateMultistrip, PixelTypes.L8, TiffEncoderCompression.ModifiedHuffman, TiffCompression.Ccitt1D)] + public void TiffEncoder_CorrectBiMode_Bug(TestImageProvider provider, TiffEncoderCompression compression, TiffCompression expectedCompression) + where TPixel : unmanaged, IPixel + { + // arrange + var encoder = new TiffEncoder() { Compression = compression }; + using Image input = provider.GetImage(); + using var memStream = new MemoryStream(); + + // act + input.Save(memStream, encoder); + + // assert + memStream.Position = 0; + using var output = Image.Load(this.configuration, memStream); + TiffMetadata meta = output.Metadata.GetTiffMetadata(); + + // This is bug! + // BitsPerPixel must be 1, and compression must be eqals which was setted in encoder + Assert.NotEqual(TiffBitsPerPixel.Pixel1, meta.BitsPerPixel); + Assert.NotEqual(expectedCompression, meta.Compression); + + Assert.Equal(input.Metadata.GetTiffMetadata().BitsPerPixel, meta.BitsPerPixel); + Assert.Equal(TiffCompression.None, meta.Compression); + + // expected values + //// Assert.Equal(TiffBitsPerPixel.Pixel1, meta.BitsPerPixel); + //// Assert.Equal(expectedCompression, meta.Compression); + } + [Theory] [WithFile(Calliphora_RgbUncompressed, PixelTypes.Rgba32)] public void TiffEncoder_EncodeRgb_Works(TestImageProvider provider)