Browse Source

Greyscale

Former-commit-id: ccc16cc88844e4cd046130b7f9366937ae10d48a
Former-commit-id: 0859791c265f40f2a1dc6e3d1e5c3e05a8726414
Former-commit-id: 6fe4767553f7f3776e7116f9c0b1eb1c63be0eae
af/merge-core
James Jackson-South 10 years ago
parent
commit
c4e8bb2827
  1. 63
      src/ImageProcessorCore/Filters/Greyscale.cs
  2. 48
      tests/ImageProcessorCore.Tests/Processors/Filters/GreyscaleTest.cs

63
src/ImageProcessorCore/Filters/Greyscale.cs

@ -0,0 +1,63 @@
// <copyright file="Greyscale.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
namespace ImageProcessorCore
{
using Processors;
/// <summary>
/// Extension methods for the <see cref="Image{T,TP}"/> type.
/// </summary>
public static partial class ImageExtensions
{
/// <summary>
/// Applies greyscale toning to the image.
/// </summary>
/// <typeparam name="T">The pixel format.</typeparam>
/// <typeparam name="TP">The packed format. <example>long, float.</example></typeparam>
/// <param name="source">The image this method extends.</param>
/// <param name="mode">The formula to apply to perform the operation.</param>
/// <param name="progressHandler">A delegate which is called as progress is made processing the image.</param>
/// <returns>The <see cref="Image{T,TP}"/>.</returns>
public static Image<T, TP> Greyscale<T, TP>(this Image<T, TP> source, GreyscaleMode mode = GreyscaleMode.Bt709, ProgressEventHandler progressHandler = null)
where T : IPackedVector<TP>
where TP : struct
{
return Greyscale(source, source.Bounds, mode, progressHandler);
}
/// <summary>
/// Applies greyscale toning to the image.
/// </summary>
/// <typeparam name="T">The pixel format.</typeparam>
/// <typeparam name="TP">The packed format. <example>long, float.</example></typeparam>
/// <param name="source">The image this method extends.</param>
/// <param name="rectangle">
/// The <see cref="Rectangle"/> structure that specifies the portion of the image object to alter.
/// </param>
/// <param name="mode">The formula to apply to perform the operation.</param>
/// <param name="progressHandler">A delegate which is called as progress is made processing the image.</param>
/// <returns>The <see cref="Image{T,TP}"/>.</returns>
public static Image<T, TP> Greyscale<T, TP>(this Image<T, TP> source, Rectangle rectangle, GreyscaleMode mode = GreyscaleMode.Bt709, ProgressEventHandler progressHandler = null)
where T : IPackedVector<TP>
where TP : struct
{
IImageProcessor<T, TP> processor = mode == GreyscaleMode.Bt709
? (IImageProcessor<T, TP>)new GreyscaleBt709Processor<T, TP>()
: new GreyscaleBt601Processor<T, TP>();
processor.OnProgress += progressHandler;
try
{
return source.Process(rectangle, processor);
}
finally
{
processor.OnProgress -= progressHandler;
}
}
}
}

48
tests/ImageProcessorCore.Tests/Processors/Filters/GreyscaleTest.cs

@ -0,0 +1,48 @@
// <copyright file="GreyscaleTest.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
namespace ImageProcessorCore.Tests
{
using Processors;
using System.IO;
using Xunit;
public class GreyscaleTest : FileTestBase
{
public static readonly TheoryData<GreyscaleMode> GreyscaleValues
= new TheoryData<GreyscaleMode>
{
GreyscaleMode.Bt709 ,
GreyscaleMode.Bt601 ,
};
[Theory]
[MemberData("GreyscaleValues")]
public void ImageShouldApplyGreyscaleFilter(GreyscaleMode value)
{
const string path = "TestOutput/Greyscale";
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
foreach (string file in Files)
{
using (FileStream stream = File.OpenRead(file))
{
string filename = Path.GetFileNameWithoutExtension(file) + "-" + value + Path.GetExtension(file);
Image image = new Image(stream);
using (FileStream output = File.OpenWrite($"{path}/{filename}"))
{
image.Greyscale(value)
.Save(output);
}
}
}
}
}
}
Loading…
Cancel
Save