📷 A modern, cross-platform, 2D Graphics library for .NET
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

84 lines
3.5 KiB

using SixLabors.ImageSharp.Formats.Jpeg.Common;
using SixLabors.ImageSharp.Formats.Jpeg.GolangPort;
using SixLabors.ImageSharp.Formats.Jpeg.GolangPort.Components.Decoder;
using SixLabors.ImageSharp.Tests.Formats.Jpg.Utils;
using SixLabors.Primitives;
using Xunit;
using Xunit.Abstractions;
// ReSharper disable InconsistentNaming
namespace SixLabors.ImageSharp.Tests.Formats.Jpg
{
public class ParseStreamTests
{
private ITestOutputHelper Output { get; }
public ParseStreamTests(ITestOutputHelper output)
{
this.Output = output;
}
[Fact]
public void ComponentScalingIsCorrect_1ChannelJpeg()
{
using (OrigJpegDecoderCore decoder = JpegFixture.ParseStream(TestImages.Jpeg.Baseline.Jpeg400))
{
Assert.Equal(1, decoder.ComponentCount);
Assert.Equal(1, decoder.Components.Length);
Size sizeInBlocks = decoder.ImageSizeInBlocks;
Size expectedSizeInBlocks = decoder.ImageSizeInPixels.GetSubSampledSize(8);
Assert.Equal(expectedSizeInBlocks, sizeInBlocks);
Assert.Equal(sizeInBlocks, decoder.ImageSizeInMCU);
var uniform1 = new Size(1, 1);
OrigComponent c0 = decoder.Components[0];
VerifyJpeg.VerifyComponent(c0, expectedSizeInBlocks, uniform1, uniform1);
}
}
[Theory]
[InlineData(TestImages.Jpeg.Baseline.Jpeg444, 3, 1, 1)]
[InlineData(TestImages.Jpeg.Baseline.Jpeg420Exif, 3, 2, 2)]
[InlineData(TestImages.Jpeg.Baseline.Jpeg420Small, 3, 2, 2)]
[InlineData(TestImages.Jpeg.Baseline.Ycck, 4, 1, 1)] // TODO: Find Ycck or Cmyk images with different subsampling
[InlineData(TestImages.Jpeg.Baseline.Cmyk, 4, 1, 1)]
public void ComponentScalingIsCorrect_MultiChannelJpeg(
string imageFile,
int componentCount,
int hDiv,
int vDiv)
{
Size divisor = new Size(hDiv, vDiv);
using (OrigJpegDecoderCore decoder = JpegFixture.ParseStream(imageFile))
{
Assert.Equal(componentCount, decoder.ComponentCount);
Assert.Equal(componentCount, decoder.Components.Length);
OrigComponent c0 = decoder.Components[0];
OrigComponent c1 = decoder.Components[1];
OrigComponent c2 = decoder.Components[2];
var uniform1 = new Size(1, 1);
Size expectedLumaSizeInBlocks = decoder.ImageSizeInPixels.GetSubSampledSize(8);
Size expectedChromaSizeInBlocks = expectedLumaSizeInBlocks.DivideBy(divisor);
Size expectedLumaSamplingFactors = expectedLumaSizeInBlocks.DivideBy(decoder.ImageSizeInMCU);
Size expectedChromaSamplingFactors = expectedLumaSamplingFactors.DivideBy(divisor);
VerifyJpeg.VerifyComponent(c0, expectedLumaSizeInBlocks, expectedLumaSamplingFactors, uniform1);
VerifyJpeg.VerifyComponent(c1, expectedChromaSizeInBlocks, expectedChromaSamplingFactors, divisor);
VerifyJpeg.VerifyComponent(c2, expectedChromaSizeInBlocks, expectedChromaSamplingFactors, divisor);
if (componentCount == 4)
{
OrigComponent c3 = decoder.Components[2];
VerifyJpeg.VerifyComponent(c3, expectedLumaSizeInBlocks, expectedLumaSamplingFactors, uniform1);
}
}
}
}
}