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.Metadata.GetJpegMetadata().ColorType = (selectorsCount == 1) ? JpegColorType.Luminance : JpegColorType.YCbCr;
stream.Read(this.temp, 0, 3);
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>
{
var encoder = new JpegEncoderCore(this);
this.InitializeColorType<TPixel>();
this.InitializeColorType<TPixel>(image);
encoder.Encode(image, stream);
}
@ -56,16 +56,24 @@ namespace SixLabors.ImageSharp.Formats.Jpeg
where TPixel : unmanaged, IPixel<TPixel>
{
var encoder = new JpegEncoderCore(this);
this.InitializeColorType<TPixel>();
this.InitializeColorType<TPixel>(image);
return encoder.EncodeAsync(image, stream, cancellationToken);
}
/// <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>
private void InitializeColorType<TPixel>()
private void InitializeColorType<TPixel>(Image<TPixel> image)
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)
{
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.
namespace SixLabors.ImageSharp.Formats.Jpeg
@ -19,14 +19,23 @@ namespace SixLabors.ImageSharp.Formats.Jpeg
/// Initializes a new instance of the <see cref="JpegMetadata"/> class.
/// </summary>
/// <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>
/// Gets or sets the encoded quality.
/// </summary>
public int Quality { get; set; } = 75;
/// <summary>
/// Gets or sets the encoded quality.
/// </summary>
public JpegColorType? ColorType { get; set; }
/// <inheritdoc/>
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]
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));
}
}
}

Loading…
Cancel
Save