From 6fd7f4fcaad686de255487189e9330787d4dfe0e Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Fri, 15 Feb 2019 00:14:39 +1100 Subject: [PATCH] Remove hardcoded subsampling. Fix #817 --- .../Jpeg/Components/Decoder/JpegComponent.cs | 38 +++++------------- .../Formats/Jpg/JpegDecoderTests.Images.cs | 1 + tests/ImageSharp.Tests/TestImages.cs | 3 +- tests/Images/External | 2 +- .../Jpg/baseline/ycck-subsample-1222.jpg | Bin 0 -> 31527 bytes 5 files changed, 14 insertions(+), 30 deletions(-) create mode 100644 tests/Images/Input/Jpg/baseline/ycck-subsample-1222.jpg diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponent.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponent.cs index ef03582d69..cfed5d535f 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponent.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponent.cs @@ -2,8 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; using SixLabors.ImageSharp.Memory; using SixLabors.Memory; @@ -12,9 +10,9 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder { /// - /// Represents a single frame component + /// Represents a single frame component. /// - internal class JpegComponent : IDisposable, IJpegComponent + internal sealed class JpegComponent : IDisposable, IJpegComponent { private readonly MemoryAllocator memoryAllocator; @@ -31,12 +29,12 @@ public JpegComponent(MemoryAllocator memoryAllocator, JpegFrame frame, byte id, } /// - /// Gets the component Id + /// Gets the component Id. /// public byte Id { get; } /// - /// Gets or sets DC coefficient predictor + /// Gets or sets DC coefficient predictor. /// public int DcPredictor { get; set; } @@ -69,22 +67,22 @@ public JpegComponent(MemoryAllocator memoryAllocator, JpegFrame frame, byte id, public Size SamplingFactors { get; set; } /// - /// Gets the number of blocks per line + /// Gets the number of blocks per line. /// public int WidthInBlocks { get; private set; } /// - /// Gets the number of blocks per column + /// Gets the number of blocks per column. /// public int HeightInBlocks { get; private set; } /// - /// Gets or sets the index for the DC Huffman table + /// Gets or sets the index for the DC Huffman table. /// public int DCHuffmanTableId { get; set; } /// - /// Gets or sets the index for the AC Huffman table + /// Gets or sets the index for the AC Huffman table. /// public int ACHuffmanTableId { get; set; } @@ -109,24 +107,8 @@ public void Init() int blocksPerColumnForMcu = this.Frame.McusPerColumn * this.VerticalSamplingFactor; this.SizeInBlocks = new Size(blocksPerLineForMcu, blocksPerColumnForMcu); - // For 4-component images (either CMYK or YCbCrK), we only support two - // hv vectors: [0x11 0x11 0x11 0x11] and [0x22 0x11 0x11 0x22]. - // Theoretically, 4-component JPEG images could mix and match hv values - // but in practice, those two combinations are the only ones in use, - // and it simplifies the applyBlack code below if we can assume that: - // - for CMYK, the C and K channels have full samples, and if the M - // and Y channels subsample, they subsample both horizontally and - // vertically. - // - for YCbCrK, the Y and K channels have full samples. - if (this.Index == 0 || this.Index == 3) - { - this.SubSamplingDivisors = new Size(1, 1); - } - else - { - JpegComponent c0 = this.Frame.Components[0]; - this.SubSamplingDivisors = c0.SamplingFactors.DivideBy(this.SamplingFactors); - } + JpegComponent c0 = this.Frame.Components[0]; + this.SubSamplingDivisors = c0.SamplingFactors.DivideBy(this.SamplingFactors); int totalNumberOfBlocks = blocksPerColumnForMcu * (blocksPerLineForMcu + 1); int width = this.WidthInBlocks + 1; diff --git a/tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.Images.cs b/tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.Images.cs index 03f1826edd..9f34d7d09b 100644 --- a/tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.Images.cs +++ b/tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.Images.cs @@ -21,6 +21,7 @@ public partial class JpegDecoderTests TestImages.Jpeg.Baseline.Jpeg444, TestImages.Jpeg.Baseline.Bad.BadEOF, TestImages.Jpeg.Baseline.MultiScanBaselineCMYK, + TestImages.Jpeg.Baseline.YcckSubsample1222, TestImages.Jpeg.Baseline.Bad.BadRST, TestImages.Jpeg.Issues.MultiHuffmanBaseline394, TestImages.Jpeg.Issues.ExifDecodeOutOfRange694, diff --git a/tests/ImageSharp.Tests/TestImages.cs b/tests/ImageSharp.Tests/TestImages.cs index 3a497683ad..e28caf6277 100644 --- a/tests/ImageSharp.Tests/TestImages.cs +++ b/tests/ImageSharp.Tests/TestImages.cs @@ -140,13 +140,14 @@ public static class Bad public const string MultiScanBaselineCMYK = "Jpg/baseline/MultiScanBaselineCMYK.jpg"; public const string Ratio1x1 = "Jpg/baseline/ratio-1x1.jpg"; public const string Testorig12bit = "Jpg/baseline/testorig12.jpg"; + public const string YcckSubsample1222 = "Jpg/baseline/ycck-subsample-1222.jpg"; public static readonly string[] All = { Cmyk, Ycck, Exif, Floorplan, Calliphora, Turtle, GammaDalaiLamaGray, Hiyamugi, Jpeg400, Jpeg420Exif, Jpeg444, - Ratio1x1, Testorig12bit + Ratio1x1, Testorig12bit, YcckSubsample1222 }; } diff --git a/tests/Images/External b/tests/Images/External index 74995302e3..32dc8aec11 160000 --- a/tests/Images/External +++ b/tests/Images/External @@ -1 +1 @@ -Subproject commit 74995302e3c9a5913f1cf09d71b15f888d0ec022 +Subproject commit 32dc8aec1109b681f056264e6bde1f3a76f08aba diff --git a/tests/Images/Input/Jpg/baseline/ycck-subsample-1222.jpg b/tests/Images/Input/Jpg/baseline/ycck-subsample-1222.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7e112d69c8586ae7dbc08afb7c5585892c014a4e GIT binary patch literal 31527 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 z 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 literal 0 HcmV?d00001