Browse Source

Use color type of the input image, if it was not specified in the encoder options

pull/1734/head
Brian Popow 5 years ago
parent
commit
89289f1a39
  1. 3
      src/ImageSharp/Formats/Jpeg/JpegEncoderCore.cs
  2. 45
      tests/ImageSharp.Tests/Formats/Jpg/JpegEncoderTests.cs

3
src/ImageSharp/Formats/Jpeg/JpegEncoderCore.cs

@ -92,6 +92,9 @@ namespace SixLabors.ImageSharp.Formats.Jpeg
ImageMetadata metadata = image.Metadata; ImageMetadata metadata = image.Metadata;
JpegMetadata jpegMetadata = metadata.GetJpegMetadata(); JpegMetadata jpegMetadata = metadata.GetJpegMetadata();
// If the color type was not specified by the user, preserve the color type of the input image.
this.colorType ??= jpegMetadata.ColorType;
// Compute number of components based on color type in options. // Compute number of components based on color type in options.
int componentCount = (this.colorType == JpegColorType.Luminance) ? 1 : 3; int componentCount = (this.colorType == JpegColorType.Luminance) ? 1 : 3;
ReadOnlySpan<byte> componentIds = this.GetComponentIds(); ReadOnlySpan<byte> componentIds = this.GetComponentIds();

45
tests/ImageSharp.Tests/Formats/Jpg/JpegEncoderTests.cs

@ -24,6 +24,10 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg
[Trait("Format", "Jpg")] [Trait("Format", "Jpg")]
public class JpegEncoderTests public class JpegEncoderTests
{ {
private static JpegEncoder JpegEncoder => new JpegEncoder();
private static JpegDecoder JpegDecoder => new JpegDecoder();
public static readonly TheoryData<string, int> QualityFiles = public static readonly TheoryData<string, int> QualityFiles =
new TheoryData<string, int> new TheoryData<string, int>
{ {
@ -62,17 +66,37 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg
}; };
[Theory] [Theory]
[MemberData(nameof(QualityFiles))] [WithFile(TestImages.Jpeg.Baseline.Floorplan, PixelTypes.Rgba32, JpegColorType.Luminance)]
public void Encode_PreserveQuality(string imagePath, int quality) [WithFile(TestImages.Jpeg.Baseline.Jpeg444, PixelTypes.Rgba32, JpegColorType.YCbCrRatio444)]
[WithFile(TestImages.Jpeg.Baseline.Jpeg420Small, PixelTypes.Rgba32, JpegColorType.YCbCrRatio420)]
[WithFile(TestImages.Jpeg.Baseline.JpegRgb, PixelTypes.Rgba32, JpegColorType.Rgb)]
public void Encode_PreservesColorType<TPixel>(TestImageProvider<TPixel> provider, JpegColorType expectedColorType)
where TPixel : unmanaged, IPixel<TPixel>
{ {
var options = new JpegEncoder(); // arrange
using Image<TPixel> input = provider.GetImage(JpegDecoder);
using var memoryStream = new MemoryStream();
// act
input.Save(memoryStream, JpegEncoder);
// assert
memoryStream.Position = 0;
using var output = Image.Load<Rgba32>(memoryStream);
JpegMetadata meta = output.Metadata.GetJpegMetadata();
Assert.Equal(expectedColorType, meta.ColorType);
}
[Theory]
[MemberData(nameof(QualityFiles))]
public void Encode_PreservesQuality(string imagePath, int quality)
{
var testFile = TestFile.Create(imagePath); var testFile = TestFile.Create(imagePath);
using (Image<Rgba32> input = testFile.CreateRgba32Image()) using (Image<Rgba32> input = testFile.CreateRgba32Image())
{ {
using (var memStream = new MemoryStream()) using (var memStream = new MemoryStream())
{ {
input.Save(memStream, options); input.Save(memStream, JpegEncoder);
memStream.Position = 0; memStream.Position = 0;
using (var output = Image.Load<Rgba32>(memStream)) using (var output = Image.Load<Rgba32>(memStream))
@ -226,14 +250,12 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg
[MemberData(nameof(RatioFiles))] [MemberData(nameof(RatioFiles))]
public void Encode_PreserveRatio(string imagePath, int xResolution, int yResolution, PixelResolutionUnit resolutionUnit) public void Encode_PreserveRatio(string imagePath, int xResolution, int yResolution, PixelResolutionUnit resolutionUnit)
{ {
var options = new JpegEncoder();
var testFile = TestFile.Create(imagePath); var testFile = TestFile.Create(imagePath);
using (Image<Rgba32> input = testFile.CreateRgba32Image()) using (Image<Rgba32> input = testFile.CreateRgba32Image())
{ {
using (var memStream = new MemoryStream()) using (var memStream = new MemoryStream())
{ {
input.Save(memStream, options); input.Save(memStream, JpegEncoder);
memStream.Position = 0; memStream.Position = 0;
using (var output = Image.Load<Rgba32>(memStream)) using (var output = Image.Load<Rgba32>(memStream))
@ -254,11 +276,10 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg
using var input = new Image<Rgba32>(1, 1); using var input = new Image<Rgba32>(1, 1);
input.Metadata.IptcProfile = new IptcProfile(); input.Metadata.IptcProfile = new IptcProfile();
input.Metadata.IptcProfile.SetValue(IptcTag.Byline, "unit_test"); input.Metadata.IptcProfile.SetValue(IptcTag.Byline, "unit_test");
var encoder = new JpegEncoder();
// act // act
using var memStream = new MemoryStream(); using var memStream = new MemoryStream();
input.Save(memStream, encoder); input.Save(memStream, JpegEncoder);
// assert // assert
memStream.Position = 0; memStream.Position = 0;
@ -276,11 +297,10 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg
using var input = new Image<Rgba32>(1, 1); using var input = new Image<Rgba32>(1, 1);
input.Metadata.ExifProfile = new ExifProfile(); input.Metadata.ExifProfile = new ExifProfile();
input.Metadata.ExifProfile.SetValue(ExifTag.Software, "unit_test"); input.Metadata.ExifProfile.SetValue(ExifTag.Software, "unit_test");
var encoder = new JpegEncoder();
// act // act
using var memStream = new MemoryStream(); using var memStream = new MemoryStream();
input.Save(memStream, encoder); input.Save(memStream, JpegEncoder);
// assert // assert
memStream.Position = 0; memStream.Position = 0;
@ -297,11 +317,10 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg
// arrange // arrange
using var input = new Image<Rgba32>(1, 1); using var input = new Image<Rgba32>(1, 1);
input.Metadata.IccProfile = new IccProfile(IccTestDataProfiles.Profile_Random_Array); input.Metadata.IccProfile = new IccProfile(IccTestDataProfiles.Profile_Random_Array);
var encoder = new JpegEncoder();
// act // act
using var memStream = new MemoryStream(); using var memStream = new MemoryStream();
input.Save(memStream, encoder); input.Save(memStream, JpegEncoder);
// assert // assert
memStream.Position = 0; memStream.Position = 0;

Loading…
Cancel
Save