From 64fcccd54cdc37313b4bcae04e5ba8a9553296b6 Mon Sep 17 00:00:00 2001 From: Brian Popow Date: Thu, 18 May 2023 20:08:08 +0200 Subject: [PATCH 1/5] Undo predictor for cmyk images, fixes #2456 --- src/ImageSharp/Formats/Tiff/Compression/HorizontalPredictor.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ImageSharp/Formats/Tiff/Compression/HorizontalPredictor.cs b/src/ImageSharp/Formats/Tiff/Compression/HorizontalPredictor.cs index 9a4e4ba2b9..1c838b0b76 100644 --- a/src/ImageSharp/Formats/Tiff/Compression/HorizontalPredictor.cs +++ b/src/ImageSharp/Formats/Tiff/Compression/HorizontalPredictor.cs @@ -44,6 +44,7 @@ internal static class HorizontalPredictor UndoRgb24Bit(pixelBytes, width); break; case TiffColorType.Rgba8888: + case TiffColorType.Cmyk: UndoRgba32Bit(pixelBytes, width); break; case TiffColorType.Rgb161616: From f558e6f5740b7c726cdacf62a5b2ac4ddc839c4d Mon Sep 17 00:00:00 2001 From: Brian Popow Date: Thu, 18 May 2023 20:08:32 +0200 Subject: [PATCH 2/5] Add test for issue 2456 --- tests/ImageSharp.Tests/Formats/Tiff/TiffDecoderTests.cs | 1 + tests/ImageSharp.Tests/TestImages.cs | 1 + .../TiffDecoder_CanDecode_Cmyk_Rgba32_Cmyk-lzw-predictor.png | 3 +++ tests/Images/Input/Tiff/Cmyk-lzw-predictor.tiff | 3 +++ 4 files changed, 8 insertions(+) create mode 100644 tests/Images/External/ReferenceOutput/TiffDecoderTests/TiffDecoder_CanDecode_Cmyk_Rgba32_Cmyk-lzw-predictor.png create mode 100644 tests/Images/Input/Tiff/Cmyk-lzw-predictor.tiff diff --git a/tests/ImageSharp.Tests/Formats/Tiff/TiffDecoderTests.cs b/tests/ImageSharp.Tests/Formats/Tiff/TiffDecoderTests.cs index a9e2b75c02..2c8268d413 100644 --- a/tests/ImageSharp.Tests/Formats/Tiff/TiffDecoderTests.cs +++ b/tests/ImageSharp.Tests/Formats/Tiff/TiffDecoderTests.cs @@ -308,6 +308,7 @@ public class TiffDecoderTests : TiffDecoderBaseTester [Theory] [WithFile(Cmyk, PixelTypes.Rgba32)] + [WithFile(CmykLzwPredictor, PixelTypes.Rgba32)] public void TiffDecoder_CanDecode_Cmyk(TestImageProvider provider) where TPixel : unmanaged, IPixel { diff --git a/tests/ImageSharp.Tests/TestImages.cs b/tests/ImageSharp.Tests/TestImages.cs index 409378b179..1fc964a064 100644 --- a/tests/ImageSharp.Tests/TestImages.cs +++ b/tests/ImageSharp.Tests/TestImages.cs @@ -958,6 +958,7 @@ public static class TestImages public const string Cmyk = "Tiff/Cmyk.tiff"; public const string Cmyk64BitDeflate = "Tiff/cmyk_deflate_64bit.tiff"; + public const string CmykLzwPredictor = "Tiff/Cmyk-lzw-predictor.tiff"; public const string Issues1716Rgb161616BitLittleEndian = "Tiff/Issues/Issue1716.tiff"; public const string Issues1891 = "Tiff/Issues/Issue1891.tiff"; diff --git a/tests/Images/External/ReferenceOutput/TiffDecoderTests/TiffDecoder_CanDecode_Cmyk_Rgba32_Cmyk-lzw-predictor.png b/tests/Images/External/ReferenceOutput/TiffDecoderTests/TiffDecoder_CanDecode_Cmyk_Rgba32_Cmyk-lzw-predictor.png new file mode 100644 index 0000000000..00fe4de822 --- /dev/null +++ b/tests/Images/External/ReferenceOutput/TiffDecoderTests/TiffDecoder_CanDecode_Cmyk_Rgba32_Cmyk-lzw-predictor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db076491d7afc78cb5de99cb1e7a9c53f891157bf064994c60d453aec75b9c90 +size 512 diff --git a/tests/Images/Input/Tiff/Cmyk-lzw-predictor.tiff b/tests/Images/Input/Tiff/Cmyk-lzw-predictor.tiff new file mode 100644 index 0000000000..c5056a9282 --- /dev/null +++ b/tests/Images/Input/Tiff/Cmyk-lzw-predictor.tiff @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d322e42dd61c528e91ba9d16310248a4b9a77094a22761dcb9e6f132fc16fe1b +size 1080 From 107e37eaaeed043f1a095bd7810e9287e0b32c40 Mon Sep 17 00:00:00 2001 From: n0099 Date: Mon, 22 May 2023 06:04:14 +0800 Subject: [PATCH 3/5] Update Rgb48.cs --- src/ImageSharp/PixelFormats/PixelImplementations/Rgb48.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Rgb48.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Rgb48.cs index 1cf63eb24c..6bf25717ce 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Rgb48.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Rgb48.cs @@ -8,7 +8,7 @@ using System.Runtime.InteropServices; namespace SixLabors.ImageSharp.PixelFormats; /// -/// Packed pixel type containing three 16-bit unsigned normalized values ranging from 0 to 635535. +/// Packed pixel type containing three 16-bit unsigned normalized values ranging from 0 to 65535. /// /// Ranges from [0, 0, 0, 1] to [1, 1, 1, 1] in vector form. /// From b4ad3c30098ecb6e478009bbb40001a9519c00a3 Mon Sep 17 00:00:00 2001 From: Gerard Gunnewijk Date: Wed, 7 Jun 2023 15:54:54 +0200 Subject: [PATCH 4/5] Added test that shows the issue --- .../Formats/Bmp/BmpEncoderTests.cs | 24 +++++++++++++++++++ tests/ImageSharp.Tests/TestImages.cs | 2 ++ tests/Images/Input/Bmp/bit1datamatrix.bmp | 3 +++ 3 files changed, 29 insertions(+) create mode 100644 tests/Images/Input/Bmp/bit1datamatrix.bmp diff --git a/tests/ImageSharp.Tests/Formats/Bmp/BmpEncoderTests.cs b/tests/ImageSharp.Tests/Formats/Bmp/BmpEncoderTests.cs index f486310b78..a0d91c2088 100644 --- a/tests/ImageSharp.Tests/Formats/Bmp/BmpEncoderTests.cs +++ b/tests/ImageSharp.Tests/Formats/Bmp/BmpEncoderTests.cs @@ -370,6 +370,30 @@ public class BmpEncoderTests TestBmpEncoderCore(provider, bitsPerPixel); } + [Theory] + [WithFile(BlackWhitePalletDataMatrix, PixelTypes.Rgb24, BmpBitsPerPixel.Pixel1)] + public void Encode_Issue2467(TestImageProvider provider, BmpBitsPerPixel bitsPerPixel) + where TPixel : unmanaged, IPixel + { + using Image image = provider.GetImage(); + + using var reencodedStream = new MemoryStream(); + var encoder = new BmpEncoder + { + BitsPerPixel = bitsPerPixel, + SupportTransparency = false, + Quantizer = KnownQuantizers.Octree + }; + image.SaveAsBmp(reencodedStream, encoder); + reencodedStream.Seek(0, SeekOrigin.Begin); + + using Image reencodedImage = Image.Load(reencodedStream); + + reencodedImage.DebugSave(provider); + + reencodedImage.CompareToOriginal(provider); + } + private static void TestBmpEncoderCore( TestImageProvider provider, BmpBitsPerPixel bitsPerPixel, diff --git a/tests/ImageSharp.Tests/TestImages.cs b/tests/ImageSharp.Tests/TestImages.cs index 1fc964a064..8a676c02d3 100644 --- a/tests/ImageSharp.Tests/TestImages.cs +++ b/tests/ImageSharp.Tests/TestImages.cs @@ -407,6 +407,8 @@ public static class TestImages public const string Rgba321010102 = "Bmp/rgba32-1010102.bmp"; public const string RgbaAlphaBitfields = "Bmp/rgba32abf.bmp"; + public const string BlackWhitePalletDataMatrix = "Bmp/bit1datamatrix.bmp"; + public static readonly string[] BitFields = { Rgb32bfdef, diff --git a/tests/Images/Input/Bmp/bit1datamatrix.bmp b/tests/Images/Input/Bmp/bit1datamatrix.bmp new file mode 100644 index 0000000000..ee5535d112 --- /dev/null +++ b/tests/Images/Input/Bmp/bit1datamatrix.bmp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b2288e2a059b15c7855eb141c05e3ce69431e7c3ddef851033f7fd9ca39a2d4 +size 102 From b29cd27c1031a08fb78c50658fed9c8fabf23181 Mon Sep 17 00:00:00 2001 From: Gerard Gunnewijk Date: Wed, 7 Jun 2023 15:55:23 +0200 Subject: [PATCH 5/5] Fixed bug in Write1BitPixelData that wrote too many bits to the byte --- src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs b/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs index fd23a29e37..ce1660a912 100644 --- a/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs +++ b/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs @@ -668,7 +668,7 @@ internal sealed class BmpEncoderCore : IImageEncoderInternals if (quantizedPixelRow.Length % 8 != 0) { - int startIdx = quantizedPixelRow.Length - 7; + int startIdx = quantizedPixelRow.Length - (quantizedPixelRow.Length % 8); endIdx = quantizedPixelRow.Length; Write1BitPalette(stream, startIdx, endIdx, quantizedPixelRow); }