|
|
|
@ -15,30 +15,39 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg |
|
|
|
using System.Runtime.CompilerServices; |
|
|
|
|
|
|
|
using SixLabors.ImageSharp.Formats.Jpeg; |
|
|
|
using SixLabors.ImageSharp.MetaData; |
|
|
|
|
|
|
|
public partial class JpegDecoderTests |
|
|
|
{ |
|
|
|
// TODO: A JPEGsnoop & metadata expert should review if the Exif/Icc expectations are correct.
|
|
|
|
// I'm seeing several entries with Exif-related names in images where we do not decode an exif profile. (- Anton)
|
|
|
|
public static readonly TheoryData<bool, string, int, bool, bool> MetaDataTestData = |
|
|
|
new TheoryData<bool, string, int, bool, bool> |
|
|
|
{ |
|
|
|
{ false, TestImages.Jpeg.Progressive.Progress, 24, false, false }, |
|
|
|
{ false, TestImages.Jpeg.Progressive.Fb, 24, false, true }, |
|
|
|
{ false, TestImages.Jpeg.Baseline.Cmyk, 32, false, true }, |
|
|
|
{ false, TestImages.Jpeg.Baseline.Ycck, 32, true, true }, |
|
|
|
{ false, TestImages.Jpeg.Baseline.Jpeg400, 8, false, false }, |
|
|
|
{ false, TestImages.Jpeg.Baseline.Snake, 24, true, true }, |
|
|
|
{ false, TestImages.Jpeg.Baseline.Jpeg420Exif, 24, true, false }, |
|
|
|
|
|
|
|
{ true, TestImages.Jpeg.Progressive.Progress, 24, false, false }, |
|
|
|
{ true, TestImages.Jpeg.Progressive.Fb, 24, false, true }, |
|
|
|
{ true, TestImages.Jpeg.Baseline.Cmyk, 32, false, true }, |
|
|
|
{ true, TestImages.Jpeg.Baseline.Ycck, 32, true, true }, |
|
|
|
{ true, TestImages.Jpeg.Baseline.Jpeg400, 8, false, false }, |
|
|
|
{ true, TestImages.Jpeg.Baseline.Snake, 24, true, true }, |
|
|
|
{ true, TestImages.Jpeg.Baseline.Jpeg420Exif, 24, true, false }, |
|
|
|
}; |
|
|
|
new TheoryData<bool, string, int, bool, bool> |
|
|
|
{ |
|
|
|
{ false, TestImages.Jpeg.Progressive.Progress, 24, false, false }, |
|
|
|
{ false, TestImages.Jpeg.Progressive.Fb, 24, false, true }, |
|
|
|
{ false, TestImages.Jpeg.Baseline.Cmyk, 32, false, true }, |
|
|
|
{ false, TestImages.Jpeg.Baseline.Ycck, 32, true, true }, |
|
|
|
{ false, TestImages.Jpeg.Baseline.Jpeg400, 8, false, false }, |
|
|
|
{ false, TestImages.Jpeg.Baseline.Snake, 24, true, true }, |
|
|
|
{ false, TestImages.Jpeg.Baseline.Jpeg420Exif, 24, true, false }, |
|
|
|
|
|
|
|
{ true, TestImages.Jpeg.Progressive.Progress, 24, false, false }, |
|
|
|
{ true, TestImages.Jpeg.Progressive.Fb, 24, false, true }, |
|
|
|
{ true, TestImages.Jpeg.Baseline.Cmyk, 32, false, true }, |
|
|
|
{ true, TestImages.Jpeg.Baseline.Ycck, 32, true, true }, |
|
|
|
{ true, TestImages.Jpeg.Baseline.Jpeg400, 8, false, false }, |
|
|
|
{ true, TestImages.Jpeg.Baseline.Snake, 24, true, true }, |
|
|
|
{ true, TestImages.Jpeg.Baseline.Jpeg420Exif, 24, true, false }, |
|
|
|
}; |
|
|
|
|
|
|
|
public static readonly TheoryData<string, int, int, PixelResolutionUnit> RatioFiles = |
|
|
|
new TheoryData<string, int, int, PixelResolutionUnit> |
|
|
|
{ |
|
|
|
{ TestImages.Jpeg.Baseline.Ratio1x1, 1, 1 , PixelResolutionUnit.AspectRatio}, |
|
|
|
{ TestImages.Jpeg.Baseline.Snake, 300, 300 , PixelResolutionUnit.PixelsPerInch}, |
|
|
|
{ TestImages.Jpeg.Baseline.GammaDalaiLamaGray, 72, 72, PixelResolutionUnit.PixelsPerInch } |
|
|
|
}; |
|
|
|
|
|
|
|
[Theory] |
|
|
|
[MemberData(nameof(MetaDataTestData))] |
|
|
|
@ -76,14 +85,49 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg |
|
|
|
iccProfilePresent); |
|
|
|
} |
|
|
|
|
|
|
|
[Theory] |
|
|
|
[MemberData(nameof(RatioFiles))] |
|
|
|
public void Decode_VerifyRatio(string imagePath, int xResolution, int yResolution, PixelResolutionUnit resolutionUnit) |
|
|
|
{ |
|
|
|
var testFile = TestFile.Create(imagePath); |
|
|
|
using (var stream = new MemoryStream(testFile.Bytes, false)) |
|
|
|
{ |
|
|
|
var decoder = new JpegDecoder(); |
|
|
|
using (Image<Rgba32> image = decoder.Decode<Rgba32>(Configuration.Default, stream)) |
|
|
|
{ |
|
|
|
ImageMetaData meta = image.MetaData; |
|
|
|
Assert.Equal(xResolution, meta.HorizontalResolution); |
|
|
|
Assert.Equal(yResolution, meta.VerticalResolution); |
|
|
|
Assert.Equal(resolutionUnit, meta.ResolutionUnits); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
[Theory] |
|
|
|
[MemberData(nameof(RatioFiles))] |
|
|
|
public void Identify_VerifyRatio(string imagePath, int xResolution, int yResolution, PixelResolutionUnit resolutionUnit) |
|
|
|
{ |
|
|
|
var testFile = TestFile.Create(imagePath); |
|
|
|
using (var stream = new MemoryStream(testFile.Bytes, false)) |
|
|
|
{ |
|
|
|
var decoder = new JpegDecoder(); |
|
|
|
IImageInfo image = decoder.Identify(Configuration.Default, stream); |
|
|
|
ImageMetaData meta = image.MetaData; |
|
|
|
Assert.Equal(xResolution, meta.HorizontalResolution); |
|
|
|
Assert.Equal(yResolution, meta.VerticalResolution); |
|
|
|
Assert.Equal(resolutionUnit, meta.ResolutionUnits); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private static void TestImageInfo(string imagePath, IImageDecoder decoder, bool useIdentify, Action<IImageInfo> test) |
|
|
|
{ |
|
|
|
var testFile = TestFile.Create(imagePath); |
|
|
|
using (var stream = new MemoryStream(testFile.Bytes, false)) |
|
|
|
{ |
|
|
|
IImageInfo imageInfo = useIdentify |
|
|
|
? ((IImageInfoDetector)decoder).Identify(Configuration.Default, stream) |
|
|
|
: decoder.Decode<Rgba32>(Configuration.Default, stream); |
|
|
|
? ((IImageInfoDetector)decoder).Identify(Configuration.Default, stream) |
|
|
|
: decoder.Decode<Rgba32>(Configuration.Default, stream); |
|
|
|
|
|
|
|
test(imageInfo); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -141,7 +185,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
[Theory] |
|
|
|
[InlineData(false)] |
|
|
|
[InlineData(true)] |
|
|
|
@ -166,7 +210,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
[Theory] |
|
|
|
[InlineData(false)] |
|
|
|
[InlineData(true)] |
|
|
|
|