mirror of https://github.com/SixLabors/ImageSharp
Browse Source
Former-commit-id: 8c6e97ecedbaf295fe2596f1c4f39879440b7d82 Former-commit-id: b4940ff77158bb37cb8c3072ea62b99e719ecb10pull/17/head
6 changed files with 207 additions and 4 deletions
|
After Width: | Height: | Size: 3.2 KiB |
@ -0,0 +1,185 @@ |
|||
// --------------------------------------------------------------------------------------------------------------------
|
|||
// <copyright file="Mask.cs" company="James South">
|
|||
// Copyright (c) James South.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
// </copyright>
|
|||
// <summary>
|
|||
// Applies a mask to the given image. If the mask is not the same size as the image
|
|||
// it will be centered against the image.
|
|||
// </summary>
|
|||
// --------------------------------------------------------------------------------------------------------------------
|
|||
|
|||
namespace ImageProcessor.Web.Processors |
|||
{ |
|||
using System; |
|||
using System.Drawing; |
|||
using System.IO; |
|||
using System.Text; |
|||
using System.Text.RegularExpressions; |
|||
using System.Web.Hosting; |
|||
|
|||
using ImageProcessor.Processors; |
|||
using ImageProcessor.Web.Extensions; |
|||
using ImageProcessor.Web.Helpers; |
|||
|
|||
/// <summary>
|
|||
/// Applies a mask to the given image. If the mask is not the same size as the image
|
|||
/// it will be centered against the image.
|
|||
/// </summary>
|
|||
public class Mask : IWebGraphicsProcessor |
|||
{ |
|||
/// <summary>
|
|||
/// The regular expression to search strings for.
|
|||
/// </summary>
|
|||
private static readonly Regex QueryRegex = new Regex(@"(mask=|maskposition=)[^&]+", RegexOptions.Compiled); |
|||
|
|||
/// <summary>
|
|||
/// The mask image regex.
|
|||
/// </summary>
|
|||
private static readonly Regex PixelRegex = new Regex(@"mask=[\w+-]+." + ImageHelpers.ExtensionRegexPattern); |
|||
|
|||
/// <summary>
|
|||
/// The point regex.
|
|||
/// </summary>
|
|||
private static readonly Regex PointRegex = new Regex(@"maskposition=\d+,\d+", RegexOptions.Compiled); |
|||
|
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="Mask"/> class.
|
|||
/// </summary>
|
|||
public Mask() |
|||
{ |
|||
this.Processor = new ImageProcessor.Processors.Mask(); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the regular expression to search strings for.
|
|||
/// </summary>
|
|||
public Regex RegexPattern |
|||
{ |
|||
get |
|||
{ |
|||
return QueryRegex; |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the order in which this processor is to be used in a chain.
|
|||
/// </summary>
|
|||
public int SortOrder { get; private set; } |
|||
|
|||
/// <summary>
|
|||
/// Gets the associated graphics processor.
|
|||
/// </summary>
|
|||
public IGraphicsProcessor Processor { get; private set; } |
|||
|
|||
/// <summary>
|
|||
/// The position in the original string where the first character of the captured substring was found.
|
|||
/// </summary>
|
|||
/// <param name="queryString">The query string to search.</param>
|
|||
/// <returns>
|
|||
/// The zero-based starting position in the original string where the captured substring was found.
|
|||
/// </returns>
|
|||
public int MatchRegexIndex(string queryString) |
|||
{ |
|||
int index = 0; |
|||
|
|||
// Set the sort order to max to allow filtering.
|
|||
this.SortOrder = int.MaxValue; |
|||
|
|||
// First merge the matches so we can parse .
|
|||
StringBuilder stringBuilder = new StringBuilder(); |
|||
|
|||
foreach (Match match in this.RegexPattern.Matches(queryString)) |
|||
{ |
|||
if (match.Success) |
|||
{ |
|||
if (index == 0) |
|||
{ |
|||
// Set the index on the first instance only.
|
|||
this.SortOrder = match.Index; |
|||
} |
|||
|
|||
stringBuilder.Append(match.Value); |
|||
|
|||
index += 1; |
|||
} |
|||
} |
|||
|
|||
if (this.SortOrder < int.MaxValue) |
|||
{ |
|||
// Match syntax
|
|||
string toParse = stringBuilder.ToString(); |
|||
Image image = this.ParseImage(toParse); |
|||
Point? rectangle = this.ParsePoint(toParse); |
|||
this.Processor.DynamicParameter = new Tuple<Image, Point?>(image, rectangle); |
|||
} |
|||
|
|||
return this.SortOrder; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Returns the correct size of pixels.
|
|||
/// </summary>
|
|||
/// <param name="input">
|
|||
/// The input containing the value to parse.
|
|||
/// </param>
|
|||
/// <returns>
|
|||
/// The <see cref="int"/> representing the pixel size.
|
|||
/// </returns>
|
|||
public Image ParseImage(string input) |
|||
{ |
|||
Image image = null; |
|||
|
|||
// Correctly parse the path.
|
|||
string path; |
|||
this.Processor.Settings.TryGetValue("VirtualPath", out path); |
|||
|
|||
if (!string.IsNullOrWhiteSpace(path) && path.StartsWith("~/")) |
|||
{ |
|||
Match match = PixelRegex.Match(input); |
|||
|
|||
if (match.Success) |
|||
{ |
|||
string imagePath = HostingEnvironment.MapPath(path); |
|||
if (imagePath != null) |
|||
{ |
|||
imagePath = Path.Combine(imagePath, match.Value.Split('=')[1]); |
|||
using (ImageFactory factory = new ImageFactory()) |
|||
{ |
|||
factory.Load(imagePath); |
|||
image = new Bitmap(factory.Image); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
return image; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Returns the correct <see cref="Nullable{Point}"/> for the given string.
|
|||
/// </summary>
|
|||
/// <param name="input">
|
|||
/// The input string containing the value to parse.
|
|||
/// </param>
|
|||
/// <returns>
|
|||
/// The correct <see cref="Nullable{Point}"/>
|
|||
/// </returns>
|
|||
private Point? ParsePoint(string input) |
|||
{ |
|||
int[] dimensions = { }; |
|||
|
|||
foreach (Match match in PointRegex.Matches(input)) |
|||
{ |
|||
dimensions = match.Value.ToPositiveIntegerArray(); |
|||
} |
|||
|
|||
if (dimensions.Length == 2) |
|||
{ |
|||
return new Point(dimensions[0], dimensions[1]); |
|||
} |
|||
|
|||
return null; |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue