diff --git a/tests/ImageSharp.Benchmarks/Image/DecodeJpegMultiple.cs b/tests/ImageSharp.Benchmarks/Image/DecodeJpegMultiple.cs
new file mode 100644
index 000000000..a3c2eba73
--- /dev/null
+++ b/tests/ImageSharp.Benchmarks/Image/DecodeJpegMultiple.cs
@@ -0,0 +1,106 @@
+//
+// Copyright (c) James Jackson-South and contributors.
+// Licensed under the Apache License, Version 2.0.
+//
+
+namespace ImageSharp.Benchmarks.Image
+{
+ using System;
+ using System.Collections.Generic;
+ using System.Drawing;
+ using System.IO;
+ using System.Linq;
+
+ using BenchmarkDotNet.Attributes;
+
+ using Image = ImageSharp.Image;
+ using ImageSharpSize = ImageSharp.Size;
+
+ public class DecodeJpegMultiple
+ {
+ private const string Folder = "../ImageSharp.Tests/TestImages/Formats/Jpg/";
+
+ private Dictionary fileNamesToBytes;
+
+ public enum JpegTestingMode
+ {
+ All,
+
+ SmallImagesOnly,
+
+ LargeImagesOnly,
+
+ CalliphoraOnly,
+ }
+
+ [Params(JpegTestingMode.All, JpegTestingMode.SmallImagesOnly, JpegTestingMode.LargeImagesOnly,
+ JpegTestingMode.CalliphoraOnly)]
+ public JpegTestingMode Mode { get; set; }
+
+ private IEnumerable> RequestedImages
+ {
+ get
+ {
+ int thresholdInBytes = 100000;
+
+ switch (this.Mode)
+ {
+ case JpegTestingMode.All:
+ return this.fileNamesToBytes;
+ case JpegTestingMode.SmallImagesOnly:
+ return this.fileNamesToBytes.Where(kv => kv.Value.Length < thresholdInBytes);
+ case JpegTestingMode.LargeImagesOnly:
+ return this.fileNamesToBytes.Where(kv => kv.Value.Length >= thresholdInBytes);
+ case JpegTestingMode.CalliphoraOnly:
+ return new[] { this.fileNamesToBytes.First(kv => kv.Key.ToLower().Contains("calliphora")) };
+ default:
+ throw new ArgumentOutOfRangeException();
+ }
+ }
+ }
+
+ [Benchmark(Description = "DecodeJpegMultiple - ImageSharp")]
+ public ImageSharpSize JpegImageSharp()
+ {
+ ImageSharpSize lastSize = new ImageSharpSize();
+ foreach (var kv in this.RequestedImages)
+ {
+ using (MemoryStream memoryStream = new MemoryStream(kv.Value))
+ {
+ Image image = new Image(memoryStream);
+ lastSize = new ImageSharpSize(image.Width, image.Height);
+ }
+ }
+
+ return lastSize;
+ }
+
+ [Benchmark(Baseline = true, Description = "DecodeJpegMultiple - System.Drawing")]
+ public Size JpegSystemDrawing()
+ {
+ Size lastSize = new Size();
+ foreach (var kv in this.RequestedImages)
+ {
+ using (MemoryStream memoryStream = new MemoryStream(kv.Value))
+ {
+ using (System.Drawing.Image image = System.Drawing.Image.FromStream(memoryStream))
+ {
+ lastSize = image.Size;
+ }
+ }
+ }
+
+ return lastSize;
+ }
+
+ [Setup]
+ public void ReadImages()
+ {
+ if (this.fileNamesToBytes != null) return;
+
+ var allFiles = Directory.EnumerateFiles(Folder, "*.jpg", SearchOption.AllDirectories).ToArray();
+
+ this.fileNamesToBytes = allFiles.ToDictionary(fn => fn, File.ReadAllBytes);
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/ImageSharp.Tests/TestImages.cs b/tests/ImageSharp.Tests/TestImages.cs
index 05d18d80a..9c0a9d66c 100644
--- a/tests/ImageSharp.Tests/TestImages.cs
+++ b/tests/ImageSharp.Tests/TestImages.cs
@@ -39,16 +39,26 @@ namespace ImageSharp.Tests
private static readonly string folder = "TestImages/Formats/Jpg/";
public static string Cmyk => folder + "cmyk.jpg";
public static string Exif => folder + "exif.jpg";
- public static string Floorplan => folder + "Floorplan.jpeg";
+ public static string Floorplan => folder + "Floorplan.jpg";
public static string Calliphora => folder + "Calliphora.jpg";
public static string Turtle => folder + "turtle.jpg";
public static string Fb => folder + "fb.jpg";
public static string Progress => folder + "progress.jpg";
public static string GammaDalaiLamaGray => folder + "gamma_dalai_lama_gray.jpg";
+ public static string Festzug => folder + "Festzug.jpg";
+ public static string Hiyamugi => folder + "Hiyamugi.jpg";
+
+ public static string Jpeg400 => folder + "baseline/jpeg400jfif.jpg";
+ public static string Jpeg420 => folder + "baseline/jpeg420exif.jpg";
+ public static string Jpeg422 => folder + "baseline/jpeg422jfif.jpg";
+ public static string Jpeg444 => folder + "baseline/jpeg444.jpg";
+
public static readonly string[] All = {
- Cmyk, Exif, Floorplan, Calliphora, Turtle, Fb, Progress, GammaDalaiLamaGray
+ Cmyk, Exif, Floorplan, Calliphora, Turtle, Fb, Progress, GammaDalaiLamaGray,
+ Festzug, Hiyamugi,
+ Jpeg400, Jpeg420, Jpeg444,
};
}
diff --git a/tests/ImageSharp.Tests/TestImages/Formats/Jpg/Festzug.jpg b/tests/ImageSharp.Tests/TestImages/Formats/Jpg/Festzug.jpg
new file mode 100644
index 000000000..aff6b7e50
--- /dev/null
+++ b/tests/ImageSharp.Tests/TestImages/Formats/Jpg/Festzug.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:06239c321880733aad329338a647b565bf7321d74523ea3fc3b6ced45d7b2058
+size 49977
diff --git a/tests/ImageSharp.Tests/TestImages/Formats/Jpg/Floorplan.jpeg b/tests/ImageSharp.Tests/TestImages/Formats/Jpg/Floorplan.jpg
similarity index 100%
rename from tests/ImageSharp.Tests/TestImages/Formats/Jpg/Floorplan.jpeg
rename to tests/ImageSharp.Tests/TestImages/Formats/Jpg/Floorplan.jpg
diff --git a/tests/ImageSharp.Tests/TestImages/Formats/Jpg/Hiyamugi.jpg b/tests/ImageSharp.Tests/TestImages/Formats/Jpg/Hiyamugi.jpg
new file mode 100644
index 000000000..7de7a00b4
--- /dev/null
+++ b/tests/ImageSharp.Tests/TestImages/Formats/Jpg/Hiyamugi.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ff20d5d0ad75e648b1ea388f65fb41d02bd2a049cd22ef86a4648b357bde94ce
+size 540458
diff --git a/tests/ImageSharp.Tests/TestImages/Formats/Jpg/baseline/jpeg400jfif.jpg b/tests/ImageSharp.Tests/TestImages/Formats/Jpg/baseline/jpeg400jfif.jpg
new file mode 100644
index 000000000..606a466d4
--- /dev/null
+++ b/tests/ImageSharp.Tests/TestImages/Formats/Jpg/baseline/jpeg400jfif.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f4fc842ed15a8c451d25f2595d68b533777b19f10748d961ab2b0afcc51bcc07
+size 45066
diff --git a/tests/ImageSharp.Tests/TestImages/Formats/Jpg/baseline/jpeg420exif.jpg b/tests/ImageSharp.Tests/TestImages/Formats/Jpg/baseline/jpeg420exif.jpg
new file mode 100644
index 000000000..522a4c2fe
--- /dev/null
+++ b/tests/ImageSharp.Tests/TestImages/Formats/Jpg/baseline/jpeg420exif.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:223f9ca11722e7eccae9eadb158fa2c7bf806ed0aa6ee4390a96df7770035ba4
+size 768608
diff --git a/tests/ImageSharp.Tests/TestImages/Formats/Jpg/baseline/jpeg444.jpg b/tests/ImageSharp.Tests/TestImages/Formats/Jpg/baseline/jpeg444.jpg
new file mode 100644
index 000000000..1887fa4a5
--- /dev/null
+++ b/tests/ImageSharp.Tests/TestImages/Formats/Jpg/baseline/jpeg444.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:89c632bbc42bc917f81e7c47595c95cb914a619604ac07b8cebf6fd4d1d744ca
+size 5667
diff --git a/tests/ImageSharp.Tests/TestImages/Formats/Jpg/testimgint.jpg b/tests/ImageSharp.Tests/TestImages/Formats/Jpg/testimgint.jpg
new file mode 100644
index 000000000..aa875789e
--- /dev/null
+++ b/tests/ImageSharp.Tests/TestImages/Formats/Jpg/testimgint.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:491679b8057739b3c8e5bacd1e918efb1691d271cbbd69820ff8d480dcb90963
+size 5756
diff --git a/tests/ImageSharp.Tests/TestImages/Formats/Jpg/testorig.jpg b/tests/ImageSharp.Tests/TestImages/Formats/Jpg/testorig.jpg
new file mode 100644
index 000000000..ea8e1331b
--- /dev/null
+++ b/tests/ImageSharp.Tests/TestImages/Formats/Jpg/testorig.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:acc6ec555d41d15b368320edaa3b20958ee6fa97cb6e4a18d1213d5ae8bec73b
+size 5770