Skip to content

Commit

Permalink
Add fade border filter
Browse files Browse the repository at this point in the history
  • Loading branch information
hajduakos committed Apr 1, 2020
1 parent acd2168 commit e8339e9
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 1 deletion.
9 changes: 9 additions & 0 deletions FilterLib.Tests/FilterTests/BorderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,14 @@ public void TestJitterBorder()
Assert.IsTrue(Common.CheckFilter("_input.bmp", "JitterBorder_20_Red_0.bmp",
new JitterBorderFilter(Size.Absolute(20), new RGB(255, 0, 0), 0), 1));
}

[Test]
public void TestFadeBorder()
{
Assert.IsTrue(Common.CheckFilter("_input.bmp", "_input.bmp",
new FadeBorderFilter(Size.Absolute(0), new RGB(0, 0, 0)), 1));
Assert.IsTrue(Common.CheckFilter("_input.bmp", "FadeBorder_20_Red.bmp",
new FadeBorderFilter(Size.Absolute(20), new RGB(255, 0, 0)), 1));
}
}
}
2 changes: 1 addition & 1 deletion FilterLib.Tests/ReflectiveApiTests/ApiTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ public class ApiTests
{
[Test]
public void TestListFilters() =>
Assert.AreEqual(55, ReflectiveApi.GetFilterTypes().ToArray().Length);
Assert.AreEqual(56, ReflectiveApi.GetFilterTypes().ToArray().Length);

[Test]
public void TestListBlends() =>
Expand Down
11 changes: 11 additions & 0 deletions FilterLib.Tests/ReflectiveApiTests/BorderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,16 @@ public void TestJitterBorder()
Assert.AreEqual(new RGB(255, 0, 0), ff.Color);
Assert.AreEqual(15, ff.Seed);
}
[Test]
public void TestFadeBorder()
{
IFilter f = ReflectiveApi.ConstructFilterByName("FadeBorder");
Assert.IsInstanceOf<FadeBorderFilter>(f);
ReflectiveApi.SetFilterPropertyByName(f, "Width", "8px");
ReflectiveApi.SetFilterPropertyByName(f, "Color", "(255, 0, 0)");
FadeBorderFilter ff = f as FadeBorderFilter;
Assert.AreEqual(8, ff.Width.ToAbsolute(0));
Assert.AreEqual(new RGB(255, 0, 0), ff.Color);
}
}
}
Binary file added FilterLib.Tests/TestImages/FadeBorder_20_Red.bmp
Binary file not shown.
68 changes: 68 additions & 0 deletions FilterLib/Filters/Border/FadeBorderFilter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
using FilterLib.Reporting;
using FilterLib.Util;
using System;
using System.Drawing;

namespace FilterLib.Filters.Border
{
/// <summary>
/// Fade border filter.
/// </summary>
[Filter]
public sealed class FadeBorderFilter : FilterInPlaceBase
{
/// <summary>
/// Border width.
/// </summary>
[FilterParam]
public Util.Size Width { get; set; }

/// <summary>
/// Border color.
/// </summary>
[FilterParam]
public RGB Color { get; set; }

/// <summary>
/// Constructor.
/// </summary>
public FadeBorderFilter() : this(Util.Size.Absolute(0), new RGB(0, 0, 0)) { }

/// <summary>
/// Constructor.
/// </summary>
/// <param name="width">Border width</param>
/// <param name="color">Border color</param>
public FadeBorderFilter(Util.Size width, RGB color)
{
this.Width = width;
this.Color = color;
}

/// <summary>
/// Apply filter by modifying the original image.
/// </summary>
/// <param name="image">Input image</param>
/// <param name="reporter">Reporter (optional)</param>
public override void ApplyInPlace(Bitmap image, IReporter reporter = null)
{
reporter?.Start();
int w = image.Width, h = image.Height;
int borderWidth = Width.ToAbsolute(Math.Max(w, h));
using (Graphics gfx = Graphics.FromImage(image))
{
// Draw rectangles with decreasing alpha value
for (int k = 0; k < borderWidth; ++k)
{
using Pen pen = new Pen(System.Drawing.Color.FromArgb((int)(255 - k / (float)(borderWidth - 1) * 255), Color.R, Color.G, Color.B));
gfx.DrawLine(pen, 0, k, w, k);
gfx.DrawLine(pen, k, 0, k, h);
gfx.DrawLine(pen, 0, h - 1 - k, w, h - 1 - k);
gfx.DrawLine(pen, w - 1 - k, 0, w - 1 - k, h);
reporter?.Report(k, 0, borderWidth - 1);
}
}
reporter?.Done();
}
}
}

0 comments on commit e8339e9

Please sign in to comment.