Browse Source

Merge branch 'master' into master

af/merge-core
James Jackson-South 8 years ago
committed by GitHub
parent
commit
93dd0ef1d5
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      tests/ImageSharp.Benchmarks/Codecs/CopyPixels.cs
  2. 57
      tests/ImageSharp.Benchmarks/Codecs/DecodeBmp.cs
  3. 75
      tests/ImageSharp.Benchmarks/Codecs/DecodeFilteredPng.cs
  4. 57
      tests/ImageSharp.Benchmarks/Codecs/DecodeGif.cs
  5. 32
      tests/ImageSharp.Benchmarks/Codecs/DecodePng.cs
  6. 35
      tests/ImageSharp.Benchmarks/Codecs/EncodeBmp.cs
  7. 28
      tests/ImageSharp.Benchmarks/Codecs/EncodeBmpMultiple.cs
  8. 63
      tests/ImageSharp.Benchmarks/Codecs/EncodeGif.cs
  9. 37
      tests/ImageSharp.Benchmarks/Codecs/EncodeGifMultiple.cs
  10. 31
      tests/ImageSharp.Benchmarks/Codecs/EncodeIndexedPng.cs
  11. 63
      tests/ImageSharp.Benchmarks/Codecs/EncodePng.cs
  12. 32
      tests/ImageSharp.Benchmarks/Codecs/GetSetPixel.cs
  13. 2
      tests/ImageSharp.Benchmarks/Codecs/ImageBenchmarkTests.cs
  14. 43
      tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpeg.cs
  15. 25
      tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpegMultiple.cs
  16. 2
      tests/ImageSharp.Benchmarks/Codecs/Jpeg/EncodeJpeg.cs
  17. 30
      tests/ImageSharp.Benchmarks/Codecs/Jpeg/EncodeJpegMultiple.cs
  18. 2
      tests/ImageSharp.Benchmarks/Codecs/Jpeg/YCbCrColorConversion.cs
  19. 2
      tests/ImageSharp.Benchmarks/Codecs/MultiImageBenchmarkBase.cs
  20. 2
      tests/ImageSharp.Benchmarks/Color/Bulk/PackFromVector4.cs
  21. 2
      tests/ImageSharp.Benchmarks/Color/Bulk/PackFromXyzw.cs
  22. 2
      tests/ImageSharp.Benchmarks/Color/Bulk/ToVector4.cs
  23. 2
      tests/ImageSharp.Benchmarks/Color/Bulk/ToXyz.cs
  24. 2
      tests/ImageSharp.Benchmarks/Color/Bulk/ToXyzw.cs
  25. 2
      tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToCieLabConvert.cs
  26. 2
      tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToHunterLabConvert.cs
  27. 2
      tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToLmsConvert.cs
  28. 2
      tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToRgbConvert.cs
  29. 2
      tests/ImageSharp.Benchmarks/Color/RgbWorkingSpaceAdapt.cs
  30. 56
      tests/ImageSharp.Benchmarks/Image/DecodeBmp.cs
  31. 74
      tests/ImageSharp.Benchmarks/Image/DecodeFilteredPng.cs
  32. 56
      tests/ImageSharp.Benchmarks/Image/DecodeGif.cs
  33. 43
      tests/ImageSharp.Benchmarks/Image/EncodeBmpMultiple.cs
  34. 63
      tests/ImageSharp.Benchmarks/Image/EncodeGif.cs
  35. 54
      tests/ImageSharp.Benchmarks/Image/EncodeGifMultiple.cs
  36. 83
      tests/ImageSharp.Benchmarks/Image/EncodePng.cs
  37. 41
      tests/ImageSharp.Benchmarks/Image/GetSetPixel.cs
  38. 44
      tests/ImageSharp.Benchmarks/Image/Jpeg/EncodeJpegMultiple.cs

2
tests/ImageSharp.Benchmarks/Image/CopyPixels.cs → tests/ImageSharp.Benchmarks/Codecs/CopyPixels.cs

@ -5,7 +5,7 @@
using SixLabors.ImageSharp.PixelFormats;
namespace SixLabors.ImageSharp.Benchmarks.Image
namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
using System;
using System.Threading.Tasks;

57
tests/ImageSharp.Benchmarks/Codecs/DecodeBmp.cs

@ -0,0 +1,57 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Drawing;
using System.IO;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Tests;
using CoreSize = SixLabors.Primitives.Size;
using SDImage = System.Drawing.Image;
namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
[Config(typeof(Config.ShortClr))]
public class DecodeBmp : BenchmarkBase
{
private byte[] bmpBytes;
private string TestImageFullPath => Path.Combine(TestEnvironment.InputImagesDirectoryFullPath, this.TestImage);
[GlobalSetup]
public void ReadImages()
{
if (this.bmpBytes == null)
{
this.bmpBytes = File.ReadAllBytes(this.TestImageFullPath);
}
}
[Params(TestImages.Bmp.Car)]
public string TestImage { get; set; }
[Benchmark(Baseline = true, Description = "System.Drawing Bmp")]
public Size BmpSystemDrawing()
{
using (var memoryStream = new MemoryStream(this.bmpBytes))
{
using (var image = SDImage.FromStream(memoryStream))
{
return image.Size;
}
}
}
[Benchmark(Description = "ImageSharp Bmp")]
public CoreSize BmpCore()
{
using (var memoryStream = new MemoryStream(this.bmpBytes))
{
using (var image = Image.Load<Rgba32>(memoryStream))
{
return new CoreSize(image.Width, image.Height);
}
}
}
}
}

75
tests/ImageSharp.Benchmarks/Codecs/DecodeFilteredPng.cs

@ -0,0 +1,75 @@
// <copyright file="DecodePng.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
using System.IO;
using System.Runtime.CompilerServices;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Tests;
using CoreSize = SixLabors.Primitives.Size;
namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
[Config(typeof(Config.ShortClr))]
public class DecodeFilteredPng : BenchmarkBase
{
private byte[] filter0;
private byte[] filter1;
private byte[] filter2;
private byte[] filter3;
private byte[] filter4;
[GlobalSetup]
public void ReadImages()
{
this.filter0 = File.ReadAllBytes(TestImageFullPath(TestImages.Png.Filter0));
this.filter1 = File.ReadAllBytes(TestImageFullPath(TestImages.Png.Filter1));
this.filter2 = File.ReadAllBytes(TestImageFullPath(TestImages.Png.Filter2));
this.filter3 = File.ReadAllBytes(TestImageFullPath(TestImages.Png.Filter3));
this.filter4 = File.ReadAllBytes(TestImageFullPath(TestImages.Png.Filter4));
}
[Benchmark(Baseline = true, Description = "None-filtered PNG file")]
public CoreSize PngFilter0()
{
return LoadPng(this.filter0);
}
[Benchmark(Description = "Sub-filtered PNG file")]
public CoreSize PngFilter1()
{
return LoadPng(this.filter1);
}
[Benchmark(Description = "Up-filtered PNG file")]
public CoreSize PngFilter2()
{
return LoadPng(this.filter2);
}
[Benchmark(Description = "Average-filtered PNG file")]
public CoreSize PngFilter3()
{
return LoadPng(this.filter3);
}
[Benchmark(Description = "Paeth-filtered PNG file")]
public CoreSize PngFilter4()
{
return LoadPng(this.filter4);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static CoreSize LoadPng(byte[] bytes)
{
using (var image = Image.Load<Rgba32>(bytes))
{
return image.Size();
}
}
private static string TestImageFullPath(string path) => Path.Combine(TestEnvironment.InputImagesDirectoryFullPath, path);
}
}

57
tests/ImageSharp.Benchmarks/Codecs/DecodeGif.cs

@ -0,0 +1,57 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Drawing;
using System.IO;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Tests;
using CoreSize = SixLabors.Primitives.Size;
using SDImage = System.Drawing.Image;
namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
[Config(typeof(Config.ShortClr))]
public class DecodeGif : BenchmarkBase
{
private byte[] gifBytes;
private string TestImageFullPath => Path.Combine(TestEnvironment.InputImagesDirectoryFullPath, this.TestImage);
[GlobalSetup]
public void ReadImages()
{
if (this.gifBytes == null)
{
this.gifBytes = File.ReadAllBytes(this.TestImageFullPath);
}
}
[Params(TestImages.Gif.Rings)]
public string TestImage { get; set; }
[Benchmark(Baseline = true, Description = "System.Drawing Gif")]
public Size GifSystemDrawing()
{
using (var memoryStream = new MemoryStream(this.gifBytes))
{
using (var image = SDImage.FromStream(memoryStream))
{
return image.Size;
}
}
}
[Benchmark(Description = "ImageSharp Gif")]
public CoreSize GifCore()
{
using (var memoryStream = new MemoryStream(this.gifBytes))
{
using (var image = Image.Load<Rgba32>(memoryStream))
{
return new CoreSize(image.Width, image.Height);
}
}
}
}
}

32
tests/ImageSharp.Benchmarks/Image/DecodePng.cs → tests/ImageSharp.Benchmarks/Codecs/DecodePng.cs

@ -1,31 +1,23 @@
// <copyright file="DecodePng.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
using System.Drawing;
using System.IO;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Tests;
using CoreSize = SixLabors.Primitives.Size;
using SDImage = System.Drawing.Image;
namespace SixLabors.ImageSharp.Benchmarks.Image
namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
using System.Drawing;
using System.IO;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Tests;
using CoreImage = ImageSharp.Image;
using CoreSize = SixLabors.Primitives.Size;
[Config(typeof(Config.ShortClr))]
public class DecodePng : BenchmarkBase
{
private byte[] pngBytes;
private string TestImageFullPath => Path.Combine(
TestEnvironment.InputImagesDirectoryFullPath,
this.TestImage);
private string TestImageFullPath => Path.Combine(TestEnvironment.InputImagesDirectoryFullPath, this.TestImage);
[Params(TestImages.Png.Splash)]
public string TestImage { get; set; }
@ -44,7 +36,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Image
{
using (var memoryStream = new MemoryStream(this.pngBytes))
{
using (var image = Image.FromStream(memoryStream))
using (var image = SDImage.FromStream(memoryStream))
{
return image.Size;
}
@ -56,9 +48,9 @@ namespace SixLabors.ImageSharp.Benchmarks.Image
{
using (var memoryStream = new MemoryStream(this.pngBytes))
{
using (var image = CoreImage.Load<Rgba32>(memoryStream))
using (var image = Image.Load<Rgba32>(memoryStream))
{
return new CoreSize(image.Width, image.Height);
return image.Size();
}
}
}

35
tests/ImageSharp.Benchmarks/Image/EncodeBmp.cs → tests/ImageSharp.Benchmarks/Codecs/EncodeBmp.cs

@ -1,25 +1,20 @@
// <copyright file="EncodeBmp.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
using System.Drawing.Imaging;
using System.IO;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Tests;
using SDImage = System.Drawing.Image;
namespace SixLabors.ImageSharp.Benchmarks.Image
namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using BenchmarkDotNet.Attributes;
using CoreImage = ImageSharp.Image;
[Config(typeof(Config.ShortClr))]
public class EncodeBmp : BenchmarkBase
{
// System.Drawing needs this.
private Stream bmpStream;
private Image bmpDrawing;
private SDImage bmpDrawing;
private Image<Rgba32> bmpCore;
[GlobalSetup]
@ -27,10 +22,10 @@ namespace SixLabors.ImageSharp.Benchmarks.Image
{
if (this.bmpStream == null)
{
this.bmpStream = File.OpenRead("../ImageSharp.Tests/TestImages/Formats/Bmp/Car.bmp");
this.bmpCore = CoreImage.Load<Rgba32>(this.bmpStream);
this.bmpStream = File.OpenRead(Path.Combine(TestEnvironment.InputImagesDirectoryFullPath, TestImages.Bmp.Car));
this.bmpCore = Image.Load<Rgba32>(this.bmpStream);
this.bmpStream.Position = 0;
this.bmpDrawing = Image.FromStream(this.bmpStream);
this.bmpDrawing = SDImage.FromStream(this.bmpStream);
}
}
@ -45,7 +40,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Image
[Benchmark(Baseline = true, Description = "System.Drawing Bmp")]
public void BmpSystemDrawing()
{
using (MemoryStream memoryStream = new MemoryStream())
using (var memoryStream = new MemoryStream())
{
this.bmpDrawing.Save(memoryStream, ImageFormat.Bmp);
}
@ -54,10 +49,10 @@ namespace SixLabors.ImageSharp.Benchmarks.Image
[Benchmark(Description = "ImageSharp Bmp")]
public void BmpCore()
{
using (MemoryStream memoryStream = new MemoryStream())
using (var memoryStream = new MemoryStream())
{
this.bmpCore.SaveAsBmp(memoryStream);
}
}
}
}
}

28
tests/ImageSharp.Benchmarks/Codecs/EncodeBmpMultiple.cs

@ -0,0 +1,28 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Collections.Generic;
using System.Drawing.Imaging;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Formats.Bmp;
namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
[Config(typeof(Config.ShortClr))]
public class EncodeBmpMultiple : MultiImageBenchmarkBase.WithImagesPreloaded
{
protected override IEnumerable<string> InputImageSubfoldersOrFiles => new[] { "Bmp/", "Jpg/baseline" };
[Benchmark(Description = "EncodeBmpMultiple - ImageSharp")]
public void EncodeBmpImageSharp()
{
this.ForEachImageSharpImage((img, ms) => { img.Save(ms, new BmpEncoder()); return null; });
}
[Benchmark(Baseline = true, Description = "EncodeBmpMultiple - System.Drawing")]
public void EncodeBmpSystemDrawing()
{
this.ForEachSystemDrawingImage((img, ms) => { img.Save(ms, ImageFormat.Bmp); return null; });
}
}
}

63
tests/ImageSharp.Benchmarks/Codecs/EncodeGif.cs

@ -0,0 +1,63 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Drawing.Imaging;
using System.IO;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Formats.Gif;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing.Quantization;
using SixLabors.ImageSharp.Tests;
using SDImage = System.Drawing.Image;
namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
[Config(typeof(Config.ShortClr))]
public class EncodeGif : BenchmarkBase
{
// System.Drawing needs this.
private Stream bmpStream;
private SDImage bmpDrawing;
private Image<Rgba32> bmpCore;
[GlobalSetup]
public void ReadImages()
{
if (this.bmpStream == null)
{
this.bmpStream = File.OpenRead(Path.Combine(TestEnvironment.InputImagesDirectoryFullPath, TestImages.Bmp.Car));
this.bmpCore = Image.Load<Rgba32>(this.bmpStream);
this.bmpStream.Position = 0;
this.bmpDrawing = SDImage.FromStream(this.bmpStream);
}
}
[GlobalCleanup]
public void Cleanup()
{
this.bmpStream.Dispose();
this.bmpCore.Dispose();
this.bmpDrawing.Dispose();
}
[Benchmark(Baseline = true, Description = "System.Drawing Gif")]
public void GifSystemDrawing()
{
using (var memoryStream = new MemoryStream())
{
this.bmpDrawing.Save(memoryStream, ImageFormat.Gif);
}
}
[Benchmark(Description = "ImageSharp Gif")]
public void GifCore()
{
// Try to get as close to System.Drawing's output as possible
var options = new GifEncoder { Quantizer = new PaletteQuantizer(false) };
using (var memoryStream = new MemoryStream())
{
this.bmpCore.SaveAsGif(memoryStream, options);
}
}
}
}

37
tests/ImageSharp.Benchmarks/Codecs/EncodeGifMultiple.cs

@ -0,0 +1,37 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Collections.Generic;
using System.Drawing.Imaging;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Formats.Gif;
using SixLabors.ImageSharp.Processing.Quantization;
namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
[Config(typeof(Config.ShortClr))]
public class EncodeGifMultiple : MultiImageBenchmarkBase.WithImagesPreloaded
{
[Params(InputImageCategory.AllImages)]
public override InputImageCategory InputCategory { get; set; }
protected override IEnumerable<string> InputImageSubfoldersOrFiles => new[] { "Gif/" };
[Benchmark(Description = "EncodeGifMultiple - ImageSharp")]
public void EncodeGifImageSharp()
{
this.ForEachImageSharpImage((img, ms) =>
{
// Try to get as close to System.Drawing's output as possible
var options = new GifEncoder { Quantizer = new PaletteQuantizer(false) };
img.Save(ms, options); return null;
});
}
[Benchmark(Baseline = true, Description = "EncodeGifMultiple - System.Drawing")]
public void EncodeGifSystemDrawing()
{
this.ForEachSystemDrawingImage((img, ms) => { img.Save(ms, ImageFormat.Gif); return null; });
}
}
}

31
tests/ImageSharp.Benchmarks/Image/EncodeIndexedPng.cs → tests/ImageSharp.Benchmarks/Codecs/EncodeIndexedPng.cs

@ -1,39 +1,32 @@
// <copyright file="EncodeIndexedPng.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
using System.IO;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Formats.Png;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing.Quantization;
using SixLabors.ImageSharp.Tests;
using CoreImage = SixLabors.ImageSharp.Image;
namespace SixLabors.ImageSharp.Benchmarks.Image
namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
/// <summary>
/// Benchmarks saving png files using different quantizers. System.Drawing cannot save indexed png files so we cannot compare.
/// </summary>
[Config(typeof(Config.ShortClr))]
public class EncodeIndexedPng : BenchmarkBase
{
// System.Drawing needs this.
private Stream bmpStream;
private Image<Rgba32> bmpCore;
[Params(false)]
public bool LargeImage { get; set; }
[GlobalSetup]
public void ReadImages()
{
if (this.bmpStream == null)
{
string path = this.LargeImage
? "../ImageSharp.Tests/TestImages/Formats/Jpg/baseline/jpeg420exif.jpg"
: "../ImageSharp.Tests/TestImages/Formats/Bmp/Car.bmp";
this.bmpStream = File.OpenRead(path);
this.bmpStream = File.OpenRead(Path.Combine(TestEnvironment.InputImagesDirectoryFullPath, TestImages.Bmp.Car));
this.bmpCore = CoreImage.Load<Rgba32>(this.bmpStream);
this.bmpStream.Position = 0;
}
@ -51,9 +44,8 @@ namespace SixLabors.ImageSharp.Benchmarks.Image
{
using (var memoryStream = new MemoryStream())
{
var encoder = new PngEncoder { Quantizer = new OctreeQuantizer() };
this.bmpCore.SaveAsPng(memoryStream, encoder);
var options = new PngEncoder { Quantizer = KnownQuantizers.Octree };
this.bmpCore.SaveAsPng(memoryStream, options);
}
}
@ -63,7 +55,6 @@ namespace SixLabors.ImageSharp.Benchmarks.Image
using (var memoryStream = new MemoryStream())
{
var options = new PngEncoder { Quantizer = new OctreeQuantizer(false) };
this.bmpCore.SaveAsPng(memoryStream, options);
}
}
@ -73,8 +64,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Image
{
using (var memoryStream = new MemoryStream())
{
var options = new PngEncoder { Quantizer = new PaletteQuantizer() };
var options = new PngEncoder { Quantizer = KnownQuantizers.Palette };
this.bmpCore.SaveAsPng(memoryStream, options);
}
}
@ -85,7 +75,6 @@ namespace SixLabors.ImageSharp.Benchmarks.Image
using (var memoryStream = new MemoryStream())
{
var options = new PngEncoder { Quantizer = new PaletteQuantizer(false) };
this.bmpCore.SaveAsPng(memoryStream, options);
}
}
@ -95,8 +84,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Image
{
using (var memoryStream = new MemoryStream())
{
var options = new PngEncoder { Quantizer = new WuQuantizer() };
var options = new PngEncoder { Quantizer = KnownQuantizers.Wu };
this.bmpCore.SaveAsPng(memoryStream, options);
}
}
@ -107,7 +95,6 @@ namespace SixLabors.ImageSharp.Benchmarks.Image
using (var memoryStream = new MemoryStream())
{
var options = new PngEncoder { Quantizer = new WuQuantizer(false) };
this.bmpCore.SaveAsPng(memoryStream, options);
}
}

63
tests/ImageSharp.Benchmarks/Codecs/EncodePng.cs

@ -0,0 +1,63 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Drawing.Imaging;
using System.IO;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Tests;
using SDImage = System.Drawing.Image;
namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
[Config(typeof(Config.ShortClr))]
public class EncodePng : BenchmarkBase
{
// System.Drawing needs this.
private Stream bmpStream;
private SDImage bmpDrawing;
private Image<Rgba32> bmpCore;
[Params(false)]
public bool LargeImage { get; set; }
[GlobalSetup]
public void ReadImages()
{
if (this.bmpStream == null)
{
string path = Path.Combine(TestEnvironment.InputImagesDirectoryFullPath, this.LargeImage ? TestImages.Jpeg.Baseline.Jpeg420Exif : TestImages.Bmp.Car);
this.bmpStream = File.OpenRead(path);
this.bmpCore = Image.Load<Rgba32>(this.bmpStream);
this.bmpStream.Position = 0;
this.bmpDrawing = SDImage.FromStream(this.bmpStream);
}
}
[GlobalCleanup]
public void Cleanup()
{
this.bmpStream.Dispose();
this.bmpCore.Dispose();
this.bmpDrawing.Dispose();
}
[Benchmark(Baseline = true, Description = "System.Drawing Png")]
public void PngSystemDrawing()
{
using (var memoryStream = new MemoryStream())
{
this.bmpDrawing.Save(memoryStream, ImageFormat.Png);
}
}
[Benchmark(Description = "ImageSharp Png")]
public void PngCore()
{
using (var memoryStream = new MemoryStream())
{
this.bmpCore.SaveAsPng(memoryStream);
}
}
}
}

32
tests/ImageSharp.Benchmarks/Codecs/GetSetPixel.cs

@ -0,0 +1,32 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Drawing;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.PixelFormats;
namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
public class GetSetPixel : BenchmarkBase
{
[Benchmark(Baseline = true, Description = "System.Drawing GetSet pixel")]
public Color ResizeSystemDrawing()
{
using (var source = new Bitmap(400, 400))
{
source.SetPixel(200, 200, Color.White);
return source.GetPixel(200, 200);
}
}
[Benchmark(Description = "ImageSharp GetSet pixel")]
public Rgba32 ResizeCore()
{
using (var image = new Image<Rgba32>(400, 400))
{
image[200, 200] = Rgba32.White;
return image[200, 200];
}
}
}
}

2
tests/ImageSharp.Benchmarks/Image/ImageBenchmarkTests.cs → tests/ImageSharp.Benchmarks/Codecs/ImageBenchmarkTests.cs

@ -12,7 +12,7 @@
#if TEST
// ReSharper disable InconsistentNaming
namespace SixLabors.ImageSharp.Benchmarks.Image
namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
using System;
using System.Collections.Generic;

43
tests/ImageSharp.Benchmarks/Image/Jpeg/DecodeJpeg.cs → tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpeg.cs

@ -1,33 +1,24 @@
// <copyright file="DecodeJpeg.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
using System.Drawing;
using System.IO;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Formats.Jpeg.GolangPort;
using SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Tests;
using CoreSize = SixLabors.Primitives.Size;
using SDImage = System.Drawing.Image;
namespace SixLabors.ImageSharp.Benchmarks.Image.Jpeg
namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
{
using System.Drawing;
using System.IO;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Formats.Jpeg.GolangPort;
using SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort;
using SixLabors.ImageSharp.Tests;
using CoreImage = SixLabors.ImageSharp.Image;
using CoreSize = SixLabors.Primitives.Size;
[Config(typeof(Config.ShortClr))]
public class DecodeJpeg : BenchmarkBase
{
private byte[] jpegBytes;
private string TestImageFullPath => Path.Combine(
TestEnvironment.InputImagesDirectoryFullPath,
this.TestImage);
private string TestImageFullPath => Path.Combine(TestEnvironment.InputImagesDirectoryFullPath, this.TestImage);
[Params(TestImages.Jpeg.Baseline.Jpeg420Exif, TestImages.Jpeg.Baseline.Calliphora)]
public string TestImage { get; set; }
@ -44,9 +35,9 @@ namespace SixLabors.ImageSharp.Benchmarks.Image.Jpeg
[Benchmark(Baseline = true, Description = "Decode Jpeg - System.Drawing")]
public Size JpegSystemDrawing()
{
using (MemoryStream memoryStream = new MemoryStream(this.jpegBytes))
using (var memoryStream = new MemoryStream(this.jpegBytes))
{
using (Image image = Image.FromStream(memoryStream))
using (var image = SDImage.FromStream(memoryStream))
{
return image.Size;
}
@ -56,9 +47,9 @@ namespace SixLabors.ImageSharp.Benchmarks.Image.Jpeg
[Benchmark(Description = "Decode Jpeg - ImageSharp")]
public CoreSize JpegImageSharpOrig()
{
using (MemoryStream memoryStream = new MemoryStream(this.jpegBytes))
using (var memoryStream = new MemoryStream(this.jpegBytes))
{
using (Image<Rgba32> image = CoreImage.Load<Rgba32>(memoryStream, new OrigJpegDecoder()))
using (var image = Image.Load<Rgba32>(memoryStream, new OrigJpegDecoder()))
{
return new CoreSize(image.Width, image.Height);
}
@ -68,9 +59,9 @@ namespace SixLabors.ImageSharp.Benchmarks.Image.Jpeg
[Benchmark(Description = "Decode Jpeg - ImageSharp PdfJs")]
public CoreSize JpegImageSharpPdfJs()
{
using (MemoryStream memoryStream = new MemoryStream(this.jpegBytes))
using (var memoryStream = new MemoryStream(this.jpegBytes))
{
using (Image<Rgba32> image = CoreImage.Load<Rgba32>(memoryStream, new PdfJsJpegDecoder()))
using (var image = Image.Load<Rgba32>(memoryStream, new PdfJsJpegDecoder()))
{
return new CoreSize(image.Width, image.Height);
}

25
tests/ImageSharp.Benchmarks/Image/Jpeg/DecodeJpegMultiple.cs → tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpegMultiple.cs

@ -1,18 +1,13 @@
// <copyright file="DecodeJpegMultiple.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
using System.Collections.Generic;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.PixelFormats;
using SDImage = System.Drawing.Image;
namespace SixLabors.ImageSharp.Benchmarks.Image.Jpeg
namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
{
using System.Collections.Generic;
using BenchmarkDotNet.Attributes;
using CoreImage = SixLabors.ImageSharp.Image;
[Config(typeof(Config.ShortClr))]
public class DecodeJpegMultiple : MultiImageBenchmarkBase
{
@ -27,17 +22,13 @@ namespace SixLabors.ImageSharp.Benchmarks.Image.Jpeg
[Benchmark(Description = "DecodeJpegMultiple - ImageSharp")]
public void DecodeJpegImageSharpNwq()
{
this.ForEachStream(
ms => CoreImage.Load<Rgba32>(ms)
);
this.ForEachStream(ms => Image.Load<Rgba32>(ms));
}
[Benchmark(Baseline = true, Description = "DecodeJpegMultiple - System.Drawing")]
public void DecodeJpegSystemDrawing()
{
this.ForEachStream(
System.Drawing.Image.FromStream
);
this.ForEachStream(SDImage.FromStream);
}
}
}

2
tests/ImageSharp.Benchmarks/Image/Jpeg/EncodeJpeg.cs → tests/ImageSharp.Benchmarks/Codecs/Jpeg/EncodeJpeg.cs

@ -5,7 +5,7 @@
using SixLabors.ImageSharp.PixelFormats;
namespace SixLabors.ImageSharp.Benchmarks.Image.Jpeg
namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
{
using System.Drawing;
using System.Drawing.Imaging;

30
tests/ImageSharp.Benchmarks/Codecs/Jpeg/EncodeJpegMultiple.cs

@ -0,0 +1,30 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Collections.Generic;
using System.Drawing.Imaging;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Formats.Jpeg;
namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
{
[Config(typeof(Config.ShortClr))] // It's long enough to iterate through multiple files
public class EncodeJpegMultiple : MultiImageBenchmarkBase.WithImagesPreloaded
{
protected override IEnumerable<string> InputImageSubfoldersOrFiles => new[] { "Bmp/", "Jpg/baseline" };
protected override IEnumerable<string> SearchPatterns => new[] { "*.bmp", "*.jpg" };
[Benchmark(Description = "EncodeJpegMultiple - ImageSharp")]
public void EncodeJpegImageSharp()
{
this.ForEachImageSharpImage((img, ms) => { img.Save(ms, new JpegEncoder()); return null; });
}
[Benchmark(Baseline = true, Description = "EncodeJpegMultiple - System.Drawing")]
public void EncodeJpegSystemDrawing()
{
this.ForEachSystemDrawingImage((img, ms) => { img.Save(ms, ImageFormat.Jpeg); return null; });
}
}
}

2
tests/ImageSharp.Benchmarks/Image/Jpeg/YCbCrColorConversion.cs → tests/ImageSharp.Benchmarks/Codecs/Jpeg/YCbCrColorConversion.cs

@ -1,4 +1,4 @@
namespace SixLabors.ImageSharp.Benchmarks.Image.Jpeg
namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
{
using System;
using System.Numerics;

2
tests/ImageSharp.Benchmarks/Image/MultiImageBenchmarkBase.cs → tests/ImageSharp.Benchmarks/Codecs/MultiImageBenchmarkBase.cs

@ -5,7 +5,7 @@
using SixLabors.ImageSharp.PixelFormats;
namespace SixLabors.ImageSharp.Benchmarks.Image
namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
using System;
using System.Collections.Generic;

2
tests/ImageSharp.Benchmarks/Color/Bulk/PackFromVector4.cs

@ -1,5 +1,5 @@
// ReSharper disable InconsistentNaming
namespace SixLabors.ImageSharp.Benchmarks.Color.Bulk
namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
{
using System.Numerics;
using System.Runtime.CompilerServices;

2
tests/ImageSharp.Benchmarks/Color/Bulk/PackFromXyzw.cs

@ -1,5 +1,5 @@
// ReSharper disable InconsistentNaming
namespace SixLabors.ImageSharp.Benchmarks.Color.Bulk
namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
{
using System;

2
tests/ImageSharp.Benchmarks/Color/Bulk/ToVector4.cs

@ -1,5 +1,5 @@
// ReSharper disable InconsistentNaming
namespace SixLabors.ImageSharp.Benchmarks.Color.Bulk
namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
{
using System;
using System.Numerics;

2
tests/ImageSharp.Benchmarks/Color/Bulk/ToXyz.cs

@ -1,5 +1,5 @@
// ReSharper disable InconsistentNaming
namespace SixLabors.ImageSharp.Benchmarks.Color.Bulk
namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
{
using System;
using System.Numerics;

2
tests/ImageSharp.Benchmarks/Color/Bulk/ToXyzw.cs

@ -4,7 +4,7 @@ using System.Linq;
using System.Threading.Tasks;
// ReSharper disable InconsistentNaming
namespace SixLabors.ImageSharp.Benchmarks.Color.Bulk
namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
{
using BenchmarkDotNet.Attributes;

2
tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToCieLabConvert.cs

@ -1,4 +1,4 @@
namespace SixLabors.ImageSharp.Benchmarks.Color
namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces
{
using BenchmarkDotNet.Attributes;

2
tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToHunterLabConvert.cs

@ -1,4 +1,4 @@
namespace SixLabors.ImageSharp.Benchmarks.Color
namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces
{
using BenchmarkDotNet.Attributes;

2
tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToLmsConvert.cs

@ -1,4 +1,4 @@
namespace SixLabors.ImageSharp.Benchmarks.Color
namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces
{
using BenchmarkDotNet.Attributes;

2
tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToRgbConvert.cs

@ -1,4 +1,4 @@
namespace SixLabors.ImageSharp.Benchmarks.Color
namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces
{
using BenchmarkDotNet.Attributes;

2
tests/ImageSharp.Benchmarks/Color/RgbWorkingSpaceAdapt.cs

@ -1,4 +1,4 @@
namespace SixLabors.ImageSharp.Benchmarks.Color
namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces
{
using BenchmarkDotNet.Attributes;

56
tests/ImageSharp.Benchmarks/Image/DecodeBmp.cs

@ -1,56 +0,0 @@
// <copyright file="DecodeBmp.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
using SixLabors.ImageSharp.PixelFormats;
namespace SixLabors.ImageSharp.Benchmarks.Image
{
using System.Drawing;
using System.IO;
using BenchmarkDotNet.Attributes;
using CoreImage = ImageSharp.Image;
using CoreSize = SixLabors.Primitives.Size;
public class DecodeBmp : BenchmarkBase
{
private byte[] bmpBytes;
[GlobalSetup]
public void ReadImages()
{
if (this.bmpBytes == null)
{
this.bmpBytes = File.ReadAllBytes("../ImageSharp.Tests/TestImages/Formats/Bmp/Car.bmp");
}
}
[Benchmark(Baseline = true, Description = "System.Drawing Bmp")]
public Size BmpSystemDrawing()
{
using (MemoryStream memoryStream = new MemoryStream(this.bmpBytes))
{
using (Image image = Image.FromStream(memoryStream))
{
return image.Size;
}
}
}
[Benchmark(Description = "ImageSharp Bmp")]
public CoreSize BmpCore()
{
using (MemoryStream memoryStream = new MemoryStream(this.bmpBytes))
{
using (Image<Rgba32> image = CoreImage.Load<Rgba32>(memoryStream))
{
return new CoreSize(image.Width, image.Height);
}
}
}
}
}

74
tests/ImageSharp.Benchmarks/Image/DecodeFilteredPng.cs

@ -1,74 +0,0 @@
// <copyright file="DecodePng.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
using SixLabors.ImageSharp.PixelFormats;
namespace SixLabors.ImageSharp.Benchmarks.Image
{
using System.IO;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp;
using SixLabors.Primitives;
using CoreImage = ImageSharp.Image;
public class DecodeFilteredPng : BenchmarkBase
{
private MemoryStream filter0;
private MemoryStream filter1;
private MemoryStream filter2;
private MemoryStream filter3;
private MemoryStream filter4;
[GlobalSetup]
public void ReadImages()
{
this.filter0 = new MemoryStream(File.ReadAllBytes("../ImageSharp.Tests/TestImages/Formats/Png/filter0.png"));
this.filter1 = new MemoryStream(File.ReadAllBytes("../ImageSharp.Tests/TestImages/Formats/Png/filter1.png"));
this.filter2 = new MemoryStream(File.ReadAllBytes("../ImageSharp.Tests/TestImages/Formats/Png/filter2.png"));
this.filter3 = new MemoryStream(File.ReadAllBytes("../ImageSharp.Tests/TestImages/Formats/Png/filter3.png"));
this.filter4 = new MemoryStream(File.ReadAllBytes("../ImageSharp.Tests/TestImages/Formats/Png/filter4.png"));
}
private SixLabors.Primitives.Size LoadPng(MemoryStream stream)
{
using (Image<Rgba32> image = CoreImage.Load<Rgba32>(stream))
{
return new SixLabors.Primitives.Size(image.Width, image.Height);
}
}
[Benchmark(Baseline = true, Description = "None-filtered PNG file")]
public Size PngFilter0()
{
return LoadPng(filter0);
}
[Benchmark(Description = "Sub-filtered PNG file")]
public Size PngFilter1()
{
return LoadPng(filter1);
}
[Benchmark(Description = "Up-filtered PNG file")]
public Size PngFilter2()
{
return LoadPng(filter2);
}
[Benchmark(Description = "Average-filtered PNG file")]
public Size PngFilter3()
{
return LoadPng(filter3);
}
[Benchmark(Description = "Paeth-filtered PNG file")]
public Size PngFilter4()
{
return LoadPng(filter4);
}
}
}

56
tests/ImageSharp.Benchmarks/Image/DecodeGif.cs

@ -1,56 +0,0 @@
// <copyright file="DecodeGif.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
using SixLabors.ImageSharp.PixelFormats;
namespace SixLabors.ImageSharp.Benchmarks.Image
{
using System.Drawing;
using System.IO;
using BenchmarkDotNet.Attributes;
using CoreImage = ImageSharp.Image;
using CoreSize = SixLabors.Primitives.Size;
public class DecodeGif : BenchmarkBase
{
private byte[] gifBytes;
[GlobalSetup]
public void ReadImages()
{
if (this.gifBytes == null)
{
this.gifBytes = File.ReadAllBytes("../ImageSharp.Tests/TestImages/Formats/Gif/rings.gif");
}
}
[Benchmark(Baseline = true, Description = "System.Drawing Gif")]
public Size GifSystemDrawing()
{
using (MemoryStream memoryStream = new MemoryStream(this.gifBytes))
{
using (Image image = Image.FromStream(memoryStream))
{
return image.Size;
}
}
}
[Benchmark(Description = "ImageSharp Gif")]
public CoreSize GifCore()
{
using (MemoryStream memoryStream = new MemoryStream(this.gifBytes))
{
using (Image<Rgba32> image = CoreImage.Load<Rgba32>(memoryStream))
{
return new CoreSize(image.Width, image.Height);
}
}
}
}
}

43
tests/ImageSharp.Benchmarks/Image/EncodeBmpMultiple.cs

@ -1,43 +0,0 @@
// <copyright file="EncodeBmpMultiple.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
namespace SixLabors.ImageSharp.Benchmarks.Image
{
using System.Collections.Generic;
using System.Drawing.Imaging;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.Formats.Bmp;
[Config(typeof(Config.ShortClr))]
public class EncodeBmpMultiple : MultiImageBenchmarkBase.WithImagesPreloaded
{
protected override IEnumerable<string> InputImageSubfoldersOrFiles => new[] { "Bmp/", "Jpg/baseline" };
[Benchmark(Description = "EncodeBmpMultiple - ImageSharp")]
public void EncodeBmpImageSharp()
{
this.ForEachImageSharpImage(
(img, ms) =>
{
img.Save(ms, new BmpEncoder());
return null;
});
}
[Benchmark(Baseline = true, Description = "EncodeBmpMultiple - System.Drawing")]
public void EncodeBmpSystemDrawing()
{
this.ForEachSystemDrawingImage(
(img, ms) =>
{
img.Save(ms, ImageFormat.Bmp);
return null;
});
}
}
}

63
tests/ImageSharp.Benchmarks/Image/EncodeGif.cs

@ -1,63 +0,0 @@
// <copyright file="EncodeGif.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
using SixLabors.ImageSharp.PixelFormats;
namespace SixLabors.ImageSharp.Benchmarks.Image
{
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using BenchmarkDotNet.Attributes;
using CoreImage = ImageSharp.Image;
public class EncodeGif : BenchmarkBase
{
// System.Drawing needs this.
private Stream bmpStream;
private Image bmpDrawing;
private Image<Rgba32> bmpCore;
[GlobalSetup]
public void ReadImages()
{
if (this.bmpStream == null)
{
this.bmpStream = File.OpenRead("../ImageSharp.Tests/TestImages/Formats/Bmp/Car.bmp");
this.bmpCore = CoreImage.Load<Rgba32>(this.bmpStream);
this.bmpStream.Position = 0;
this.bmpDrawing = Image.FromStream(this.bmpStream);
}
}
[GlobalCleanup]
public void Cleanup()
{
this.bmpStream.Dispose();
this.bmpCore.Dispose();
this.bmpDrawing.Dispose();
}
[Benchmark(Baseline = true, Description = "System.Drawing Gif")]
public void GifSystemDrawing()
{
using (MemoryStream memoryStream = new MemoryStream())
{
this.bmpDrawing.Save(memoryStream, ImageFormat.Gif);
}
}
[Benchmark(Description = "ImageSharp Gif")]
public void GifCore()
{
using (MemoryStream memoryStream = new MemoryStream())
{
this.bmpCore.SaveAsGif(memoryStream);
}
}
}
}

54
tests/ImageSharp.Benchmarks/Image/EncodeGifMultiple.cs

@ -1,54 +0,0 @@
namespace SixLabors.ImageSharp.Benchmarks.Image
{
using System.Collections.Generic;
using System.Drawing.Imaging;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Jobs;
using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.Formats.Gif;
[Config(typeof(SingleRunConfig))]
public class EncodeGifMultiple : MultiImageBenchmarkBase.WithImagesPreloaded
{
public class SingleRunConfig : Config
{
public SingleRunConfig()
{
this.Add(
Job.Default.WithLaunchCount(1)
.WithWarmupCount(1)
.WithTargetCount(1)
);
}
}
[Params(InputImageCategory.AllImages)]
public override InputImageCategory InputCategory { get; set; }
protected override IEnumerable<string> InputImageSubfoldersOrFiles => new[] { "Gif/" };
[Benchmark(Description = "EncodeGifMultiple - ImageSharp")]
public void EncodeGifImageSharp()
{
this.ForEachImageSharpImage(
(img, ms) =>
{
img.Save(ms, new GifEncoder());
return null;
});
}
[Benchmark(Baseline = true, Description = "EncodeGifMultiple - System.Drawing")]
public void EncodeGifSystemDrawing()
{
this.ForEachSystemDrawingImage(
(img, ms) =>
{
img.Save(ms, ImageFormat.Gif);
return null;
});
}
}
}

83
tests/ImageSharp.Benchmarks/Image/EncodePng.cs

@ -1,83 +0,0 @@
// <copyright file="EncodePng.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
using SixLabors.ImageSharp.PixelFormats;
namespace SixLabors.ImageSharp.Benchmarks.Image
{
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Formats.Png;
using SixLabors.ImageSharp.Processing.Quantization;
using SixLabors.ImageSharp.Tests;
using CoreImage = ImageSharp.Image;
public class EncodePng : BenchmarkBase
{
// System.Drawing needs this.
private Stream bmpStream;
private Image bmpDrawing;
private Image<Rgba32> bmpCore;
[Params(false)]
public bool LargeImage { get; set; }
[Params(false)]
public bool UseOctreeQuantizer { get; set; }
[GlobalSetup]
public void ReadImages()
{
if (this.bmpStream == null)
{
string path = Path.Combine(
TestEnvironment.InputImagesDirectoryFullPath,
this.LargeImage ? TestImages.Jpeg.Baseline.Jpeg420Exif : TestImages.Bmp.Car);
this.bmpStream = File.OpenRead(path);
this.bmpCore = CoreImage.Load<Rgba32>(this.bmpStream);
this.bmpStream.Position = 0;
this.bmpDrawing = Image.FromStream(this.bmpStream);
}
}
[GlobalCleanup]
public void Cleanup()
{
this.bmpStream.Dispose();
this.bmpCore.Dispose();
this.bmpDrawing.Dispose();
}
[Benchmark(Baseline = true, Description = "System.Drawing Png")]
public void PngSystemDrawing()
{
using (var memoryStream = new MemoryStream())
{
this.bmpDrawing.Save(memoryStream, ImageFormat.Png);
}
}
[Benchmark(Description = "ImageSharp Png")]
public void PngCore()
{
using (var memoryStream = new MemoryStream())
{
IQuantizer quantizer = this.UseOctreeQuantizer
?
(IQuantizer)new OctreeQuantizer()
: new PaletteQuantizer();
var options = new PngEncoder { Quantizer = quantizer };
this.bmpCore.SaveAsPng(memoryStream, options);
}
}
}
}

41
tests/ImageSharp.Benchmarks/Image/GetSetPixel.cs

@ -1,41 +0,0 @@
// <copyright file="GetSetPixel.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
namespace SixLabors.ImageSharp.Benchmarks.Image
{
using System.Drawing;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.PixelFormats;
using SystemColor = System.Drawing.Color;
public class GetSetPixel : BenchmarkBase
{
[Benchmark(Baseline = true, Description = "System.Drawing GetSet pixel")]
public SystemColor ResizeSystemDrawing()
{
using (Bitmap source = new Bitmap(400, 400))
{
source.SetPixel(200, 200, SystemColor.White);
return source.GetPixel(200, 200);
}
}
[Benchmark(Description = "ImageSharp GetSet pixel")]
public Rgba32 ResizeCore()
{
using (Image<Rgba32> image = new Image<Rgba32>(400, 400))
{
using (PixelAccessor<Rgba32> imagePixels = image.Lock())
{
imagePixels[200, 200] = Rgba32.White;
return imagePixels[200, 200];
}
}
}
}
}

44
tests/ImageSharp.Benchmarks/Image/Jpeg/EncodeJpegMultiple.cs

@ -1,44 +0,0 @@
// <copyright file="EncodeJpegMultiple.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
namespace SixLabors.ImageSharp.Benchmarks.Image.Jpeg
{
using System.Collections.Generic;
using System.Drawing.Imaging;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Formats.Jpeg;
[Config(typeof(Config.ShortClr))] // It's long enough to iterate through multiple files
public class EncodeJpegMultiple : MultiImageBenchmarkBase.WithImagesPreloaded
{
protected override IEnumerable<string> InputImageSubfoldersOrFiles => new[] { "Bmp/", "Jpg/baseline" };
protected override IEnumerable<string> SearchPatterns => new[] { "*.bmp", "*.jpg" };
[Benchmark(Description = "EncodeJpegMultiple - ImageSharp")]
public void EncodeJpegImageSharp()
{
this.ForEachImageSharpImage(
(img, ms) =>
{
img.Save(ms, new JpegEncoder());
return null;
});
}
[Benchmark(Baseline = true, Description = "EncodeJpegMultiple - System.Drawing")]
public void EncodeJpegSystemDrawing()
{
this.ForEachSystemDrawingImage(
(img, ms) =>
{
img.Save(ms, ImageFormat.Jpeg);
return null;
});
}
}
}
Loading…
Cancel
Save