From d844e707601c5a4bfe8bf0e28e2ba89262b940e4 Mon Sep 17 00:00:00 2001 From: Ynse Hoornenborg Date: Tue, 30 Mar 2021 21:37:45 +0200 Subject: [PATCH] Add JpegColorType to JpegMetadata and use it to configure the JpegEncoder --- src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs | 2 ++ src/ImageSharp/Formats/Jpeg/JpegEncoder.cs | 16 ++++++++++++---- src/ImageSharp/Formats/Jpeg/JpegMetadata.cs | 15 ++++++++++++--- .../Formats/Jpg/JpegMetadataTests.cs | 4 +++- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs b/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs index c4355cdbe..f7cc82c7d 100644 --- a/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs +++ b/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs @@ -1038,6 +1038,8 @@ namespace SixLabors.ImageSharp.Formats.Jpeg this.Frame.ComponentOrder[i] = (byte)componentIndex; } + this.Metadata.GetJpegMetadata().ColorType = (selectorsCount == 1) ? JpegColorType.Luminance : JpegColorType.YCbCr; + stream.Read(this.temp, 0, 3); int spectralStart = this.temp[0]; diff --git a/src/ImageSharp/Formats/Jpeg/JpegEncoder.cs b/src/ImageSharp/Formats/Jpeg/JpegEncoder.cs index c4439b804..8131f74d2 100644 --- a/src/ImageSharp/Formats/Jpeg/JpegEncoder.cs +++ b/src/ImageSharp/Formats/Jpeg/JpegEncoder.cs @@ -40,7 +40,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg where TPixel : unmanaged, IPixel { var encoder = new JpegEncoderCore(this); - this.InitializeColorType(); + this.InitializeColorType(image); encoder.Encode(image, stream); } @@ -56,16 +56,24 @@ namespace SixLabors.ImageSharp.Formats.Jpeg where TPixel : unmanaged, IPixel { var encoder = new JpegEncoderCore(this); - this.InitializeColorType(); + this.InitializeColorType(image); return encoder.EncodeAsync(image, stream, cancellationToken); } /// - /// If ColorType was not set, set it based on the given . + /// If ColorType was not set, set it based on the given image. /// - private void InitializeColorType() + private void InitializeColorType(Image image) where TPixel : unmanaged, IPixel { + // First inspect the image metadata. + if (this.ColorType == null) + { + JpegMetadata metadata = image.Metadata.GetJpegMetadata(); + this.ColorType = metadata.ColorType; + } + + // Secondly, inspect the pixel type. if (this.ColorType == null) { bool isGrayscale = diff --git a/src/ImageSharp/Formats/Jpeg/JpegMetadata.cs b/src/ImageSharp/Formats/Jpeg/JpegMetadata.cs index c9dded635..9670d167e 100644 --- a/src/ImageSharp/Formats/Jpeg/JpegMetadata.cs +++ b/src/ImageSharp/Formats/Jpeg/JpegMetadata.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors. +// Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. namespace SixLabors.ImageSharp.Formats.Jpeg @@ -19,14 +19,23 @@ namespace SixLabors.ImageSharp.Formats.Jpeg /// Initializes a new instance of the class. /// /// The metadata to create an instance from. - private JpegMetadata(JpegMetadata other) => this.Quality = other.Quality; + private JpegMetadata(JpegMetadata other) + { + this.Quality = other.Quality; + this.ColorType = other.ColorType; + } /// /// Gets or sets the encoded quality. /// public int Quality { get; set; } = 75; + /// + /// Gets or sets the encoded quality. + /// + public JpegColorType? ColorType { get; set; } + /// public IDeepCloneable DeepClone() => new JpegMetadata(this); } -} \ No newline at end of file +} diff --git a/tests/ImageSharp.Tests/Formats/Jpg/JpegMetadataTests.cs b/tests/ImageSharp.Tests/Formats/Jpg/JpegMetadataTests.cs index e14ec81c6..503ede129 100644 --- a/tests/ImageSharp.Tests/Formats/Jpg/JpegMetadataTests.cs +++ b/tests/ImageSharp.Tests/Formats/Jpg/JpegMetadataTests.cs @@ -12,12 +12,14 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg [Fact] public void CloneIsDeep() { - var meta = new JpegMetadata { Quality = 50 }; + var meta = new JpegMetadata { Quality = 50, ColorType = JpegColorType.Luminance }; var clone = (JpegMetadata)meta.DeepClone(); clone.Quality = 99; + clone.ColorType = JpegColorType.YCbCr; Assert.False(meta.Quality.Equals(clone.Quality)); + Assert.False(meta.ColorType.Equals(clone.ColorType)); } } }