diff --git a/tests/ImageProcessorCore.Benchmarks/Image/Decode.cs b/tests/ImageProcessorCore.Benchmarks/Image/Decode.cs
new file mode 100644
index 0000000000..d6d1d2fb14
--- /dev/null
+++ b/tests/ImageProcessorCore.Benchmarks/Image/Decode.cs
@@ -0,0 +1,131 @@
+//
+// Copyright (c) James Jackson-South and contributors.
+// Licensed under the Apache License, Version 2.0.
+//
+
+namespace ImageProcessorCore.Benchmarks.Image
+{
+ using System.Drawing;
+ using System.IO;
+
+ using BenchmarkDotNet.Attributes;
+ using CoreSize = ImageProcessorCore.Size;
+ using CoreImage = ImageProcessorCore.Image;
+
+ public class Decode
+ {
+ private byte[] bmpBytes;
+ private byte[] gifBytes;
+ private byte[] jpegBytes;
+ private byte[] pngBytes;
+
+ [Setup]
+ public void ReadImages()
+ {
+ if (bmpBytes == null)
+ {
+ bmpBytes = File.ReadAllBytes("../ImageProcessorCore.Tests/TestImages/Formats/Bmp/Car.bmp");
+ }
+ if (gifBytes == null)
+ {
+ gifBytes = File.ReadAllBytes("../ImageProcessorCore.Tests/TestImages/Formats/Gif/giphy.gif");
+ }
+ if (jpegBytes == null)
+ {
+ jpegBytes = File.ReadAllBytes("../ImageProcessorCore.Tests/TestImages/Formats/Jpg/Calliphora.jpg");
+ }
+ if (pngBytes == null)
+ {
+ pngBytes = File.ReadAllBytes("../ImageProcessorCore.Tests/TestImages/Formats/Png/splash.png");
+ }
+ }
+
+ [Benchmark(Description = "System.Drawing Bmp")]
+ public Size BmpSystemDrawing()
+ {
+ using (MemoryStream memoryStream = new MemoryStream(bmpBytes))
+ {
+ using (Image image = Image.FromStream(memoryStream))
+ {
+ return image.Size;
+ }
+ }
+ }
+
+ [Benchmark(Description = "ImageProcessorCore Bmp")]
+ public CoreSize BmpCore()
+ {
+ using (MemoryStream memoryStream = new MemoryStream(bmpBytes))
+ {
+ CoreImage image = new CoreImage(memoryStream);
+ return new CoreSize(image.Width, image.Height);
+ }
+ }
+
+ [Benchmark(Description = "System.Drawing Gif")]
+ public Size GifSystemDrawing()
+ {
+ using (MemoryStream memoryStream = new MemoryStream(gifBytes))
+ {
+ using (Image image = Image.FromStream(memoryStream))
+ {
+ return image.Size;
+ }
+ }
+ }
+
+ [Benchmark(Description = "ImageProcessorCore Gif")]
+ public CoreSize GifCore()
+ {
+ using (MemoryStream memoryStream = new MemoryStream(gifBytes))
+ {
+ CoreImage image = new CoreImage(memoryStream);
+ return new CoreSize(image.Width, image.Height);
+ }
+ }
+
+ [Benchmark(Description = "System.Drawing Jpeg")]
+ public Size JpegSystemDrawing()
+ {
+ using (MemoryStream memoryStream = new MemoryStream(jpegBytes))
+ {
+ using (Image image = Image.FromStream(memoryStream))
+ {
+ return image.Size;
+ }
+ }
+ }
+
+ [Benchmark(Description = "ImageProcessorCore Jpeg")]
+ public CoreSize JpegCore()
+ {
+ using (MemoryStream memoryStream = new MemoryStream(jpegBytes))
+ {
+ CoreImage image = new CoreImage(memoryStream);
+ return new CoreSize(image.Width, image.Height);
+ }
+ }
+
+ [Benchmark(Description = "System.Drawing Png")]
+ public Size PngSystemDrawing()
+ {
+ using (MemoryStream memoryStream = new MemoryStream(pngBytes))
+ {
+ using (Image image = Image.FromStream(memoryStream))
+ {
+ return image.Size;
+ }
+ }
+ }
+
+ [Benchmark(Description = "ImageProcessorCore Png")]
+ public CoreSize PngCore()
+ {
+ using (MemoryStream memoryStream = new MemoryStream(pngBytes))
+ {
+ CoreImage image = new CoreImage(memoryStream);
+ return new CoreSize(image.Width, image.Height);
+ }
+ }
+ }
+}
diff --git a/tests/ImageProcessorCore.Benchmarks/Image/Encode.cs b/tests/ImageProcessorCore.Benchmarks/Image/Encode.cs
new file mode 100644
index 0000000000..51bc3767c2
--- /dev/null
+++ b/tests/ImageProcessorCore.Benchmarks/Image/Encode.cs
@@ -0,0 +1,141 @@
+//
+// Copyright (c) James Jackson-South and contributors.
+// Licensed under the Apache License, Version 2.0.
+//
+
+namespace ImageProcessorCore.Benchmarks.Image
+{
+ using System.Drawing;
+ using System.Drawing.Imaging;
+ using System.IO;
+
+ using BenchmarkDotNet.Attributes;
+ using CoreImage = ImageProcessorCore.Image;
+
+ public class Encode
+ {
+ // System.Drawing needs this.
+ private Stream bmpStream;
+ private Stream gifStream;
+ private Stream jpegStream;
+ private Stream pngStream;
+
+ private Image bmpDrawing;
+ private Image gifDrawing;
+ private Image jpegDrawing;
+ private Image pngDrawing;
+
+ private CoreImage bmpCore;
+ private CoreImage gifCore;
+ private CoreImage jpegCore;
+ private CoreImage pngCore;
+
+ [Setup]
+ public void ReadImages()
+ {
+ if (bmpStream == null)
+ {
+ bmpStream = File.OpenRead("../ImageProcessorCore.Tests/TestImages/Formats/Bmp/Car.bmp");
+ bmpCore = new CoreImage(bmpStream);
+ bmpStream.Position = 0;
+ bmpDrawing = Image.FromStream(bmpStream);
+ }
+
+ if (gifStream == null)
+ {
+ gifStream = File.OpenRead("../ImageProcessorCore.Tests/TestImages/Formats/Gif/giphy.gif");
+ gifCore = new CoreImage(gifStream);
+ gifStream.Position = 0;
+ gifDrawing = Image.FromStream(gifStream);
+ }
+
+ if (jpegStream == null)
+ {
+ jpegStream = File.OpenRead("../ImageProcessorCore.Tests/TestImages/Formats/Jpg/Calliphora.jpg");
+ jpegCore = new CoreImage(jpegStream);
+ jpegStream.Position = 0;
+ jpegDrawing = Image.FromStream(jpegStream);
+ }
+
+ if (pngStream == null)
+ {
+ pngStream = File.OpenRead("../ImageProcessorCore.Tests/TestImages/Formats/Png/splash.png");
+ pngCore = new CoreImage(pngStream);
+ pngStream.Position = 0;
+ pngDrawing = Image.FromStream(pngStream);
+ }
+ }
+
+ [Benchmark(Description = "System.Drawing Bmp")]
+ public void BmpSystemDrawing()
+ {
+ using (MemoryStream memoryStream = new MemoryStream())
+ {
+ bmpDrawing.Save(memoryStream, ImageFormat.Bmp);
+ }
+ }
+
+ [Benchmark(Description = "ImageProcessorCore Bmp")]
+ public void BmpCore()
+ {
+ using (MemoryStream memoryStream = new MemoryStream())
+ {
+ bmpCore.SaveAsBmp(memoryStream);
+ }
+ }
+
+ [Benchmark(Description = "System.Drawing Gif")]
+ public void GifSystemDrawing()
+ {
+ using (MemoryStream memoryStream = new MemoryStream())
+ {
+ bmpDrawing.Save(memoryStream, ImageFormat.Gif);
+ }
+ }
+
+ [Benchmark(Description = "ImageProcessorCore Gif")]
+ public void GifCore()
+ {
+ using (MemoryStream memoryStream = new MemoryStream())
+ {
+ bmpCore.SaveAsGif(memoryStream);
+ }
+ }
+
+ [Benchmark(Description = "System.Drawing Jpeg")]
+ public void JpegSystemDrawing()
+ {
+ using (MemoryStream memoryStream = new MemoryStream())
+ {
+ bmpDrawing.Save(memoryStream, ImageFormat.Jpeg);
+ }
+ }
+
+ [Benchmark(Description = "ImageProcessorCore Jpeg")]
+ public void JpegCore()
+ {
+ using (MemoryStream memoryStream = new MemoryStream())
+ {
+ bmpCore.SaveAsJpeg(memoryStream);
+ }
+ }
+
+ [Benchmark(Description = "System.Drawing Png")]
+ public void PngSystemDrawing()
+ {
+ using (MemoryStream memoryStream = new MemoryStream())
+ {
+ bmpDrawing.Save(memoryStream, ImageFormat.Png);
+ }
+ }
+
+ [Benchmark(Description = "ImageProcessorCore Png")]
+ public void PngCore()
+ {
+ using (MemoryStream memoryStream = new MemoryStream())
+ {
+ bmpCore.SaveAsPng(memoryStream);
+ }
+ }
+ }
+}