Browse Source

Add JpegColorType to JpegMetadata and use it to configure the JpegEncoder

pull/1586/head
Ynse Hoornenborg 5 years ago
parent
commit
d844e70760
  1. 2
      src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs
  2. 16
      src/ImageSharp/Formats/Jpeg/JpegEncoder.cs
  3. 15
      src/ImageSharp/Formats/Jpeg/JpegMetadata.cs
  4. 4
      tests/ImageSharp.Tests/Formats/Jpg/JpegMetadataTests.cs

2
src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs

@ -1038,6 +1038,8 @@ namespace SixLabors.ImageSharp.Formats.Jpeg
this.Frame.ComponentOrder[i] = (byte)componentIndex; this.Frame.ComponentOrder[i] = (byte)componentIndex;
} }
this.Metadata.GetJpegMetadata().ColorType = (selectorsCount == 1) ? JpegColorType.Luminance : JpegColorType.YCbCr;
stream.Read(this.temp, 0, 3); stream.Read(this.temp, 0, 3);
int spectralStart = this.temp[0]; int spectralStart = this.temp[0];

16
src/ImageSharp/Formats/Jpeg/JpegEncoder.cs

@ -40,7 +40,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg
where TPixel : unmanaged, IPixel<TPixel> where TPixel : unmanaged, IPixel<TPixel>
{ {
var encoder = new JpegEncoderCore(this); var encoder = new JpegEncoderCore(this);
this.InitializeColorType<TPixel>(); this.InitializeColorType<TPixel>(image);
encoder.Encode(image, stream); encoder.Encode(image, stream);
} }
@ -56,16 +56,24 @@ namespace SixLabors.ImageSharp.Formats.Jpeg
where TPixel : unmanaged, IPixel<TPixel> where TPixel : unmanaged, IPixel<TPixel>
{ {
var encoder = new JpegEncoderCore(this); var encoder = new JpegEncoderCore(this);
this.InitializeColorType<TPixel>(); this.InitializeColorType<TPixel>(image);
return encoder.EncodeAsync(image, stream, cancellationToken); return encoder.EncodeAsync(image, stream, cancellationToken);
} }
/// <summary> /// <summary>
/// If ColorType was not set, set it based on the given <typeparamref name="TPixel"/>. /// If ColorType was not set, set it based on the given image.
/// </summary> /// </summary>
private void InitializeColorType<TPixel>() private void InitializeColorType<TPixel>(Image<TPixel> image)
where TPixel : unmanaged, IPixel<TPixel> where TPixel : unmanaged, IPixel<TPixel>
{ {
// 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) if (this.ColorType == null)
{ {
bool isGrayscale = bool isGrayscale =

15
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. // Licensed under the Apache License, Version 2.0.
namespace SixLabors.ImageSharp.Formats.Jpeg namespace SixLabors.ImageSharp.Formats.Jpeg
@ -19,14 +19,23 @@ namespace SixLabors.ImageSharp.Formats.Jpeg
/// Initializes a new instance of the <see cref="JpegMetadata"/> class. /// Initializes a new instance of the <see cref="JpegMetadata"/> class.
/// </summary> /// </summary>
/// <param name="other">The metadata to create an instance from.</param> /// <param name="other">The metadata to create an instance from.</param>
private JpegMetadata(JpegMetadata other) => this.Quality = other.Quality; private JpegMetadata(JpegMetadata other)
{
this.Quality = other.Quality;
this.ColorType = other.ColorType;
}
/// <summary> /// <summary>
/// Gets or sets the encoded quality. /// Gets or sets the encoded quality.
/// </summary> /// </summary>
public int Quality { get; set; } = 75; public int Quality { get; set; } = 75;
/// <summary>
/// Gets or sets the encoded quality.
/// </summary>
public JpegColorType? ColorType { get; set; }
/// <inheritdoc/> /// <inheritdoc/>
public IDeepCloneable DeepClone() => new JpegMetadata(this); public IDeepCloneable DeepClone() => new JpegMetadata(this);
} }
} }

4
tests/ImageSharp.Tests/Formats/Jpg/JpegMetadataTests.cs

@ -12,12 +12,14 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg
[Fact] [Fact]
public void CloneIsDeep() public void CloneIsDeep()
{ {
var meta = new JpegMetadata { Quality = 50 }; var meta = new JpegMetadata { Quality = 50, ColorType = JpegColorType.Luminance };
var clone = (JpegMetadata)meta.DeepClone(); var clone = (JpegMetadata)meta.DeepClone();
clone.Quality = 99; clone.Quality = 99;
clone.ColorType = JpegColorType.YCbCr;
Assert.False(meta.Quality.Equals(clone.Quality)); Assert.False(meta.Quality.Equals(clone.Quality));
Assert.False(meta.ColorType.Equals(clone.ColorType));
} }
} }
} }

Loading…
Cancel
Save