mirror of https://github.com/SixLabors/ImageSharp
22 changed files with 98 additions and 791 deletions
@ -1,610 +0,0 @@ |
|||
// -----------------------------------------------------------------------
|
|||
// <copyright file="Filter.cs" company="James South">
|
|||
// TODO: Update copyright text.
|
|||
// </copyright>
|
|||
// -----------------------------------------------------------------------
|
|||
|
|||
namespace ImageProcessor.Processors |
|||
{ |
|||
#region Using
|
|||
|
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Drawing; |
|||
using System.Drawing.Drawing2D; |
|||
using System.Drawing.Imaging; |
|||
using System.IO; |
|||
using System.Text.RegularExpressions; |
|||
using System.Web; |
|||
using System.Web.Hosting; |
|||
|
|||
#endregion
|
|||
|
|||
/// <summary>
|
|||
/// Encapsulates methods with which to add filters to an image.
|
|||
/// </summary>
|
|||
public class Filter : IGraphicsProcessor |
|||
{ |
|||
/// <summary>
|
|||
/// The regular expression to search strings for.
|
|||
/// </summary>
|
|||
private static readonly Regex QueryRegex = new Regex(@"filter=(lomograph|polaroid|blackwhite|sepia|greyscale|gotham|invert|hisatch|losatch|comic)", RegexOptions.Compiled); |
|||
|
|||
/// <summary>
|
|||
/// Enumurates Argb colour channels.
|
|||
/// </summary>
|
|||
private enum ChannelArgb |
|||
{ |
|||
/// <summary>
|
|||
/// The blue channel
|
|||
/// </summary>
|
|||
Blue = 0, |
|||
|
|||
/// <summary>
|
|||
/// The green channel
|
|||
/// </summary>
|
|||
Green = 1, |
|||
|
|||
/// <summary>
|
|||
/// The red channel
|
|||
/// </summary>
|
|||
Red = 2, |
|||
|
|||
/// <summary>
|
|||
/// The alpha channel
|
|||
/// </summary>
|
|||
Alpha = 3 |
|||
} |
|||
|
|||
#region IGraphicsProcessor Members
|
|||
/// <summary>
|
|||
/// Gets the name.
|
|||
/// </summary>
|
|||
public string Name |
|||
{ |
|||
get |
|||
{ |
|||
return "Filter"; |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the description.
|
|||
/// </summary>
|
|||
public string Description |
|||
{ |
|||
get |
|||
{ |
|||
return "Encapsulates methods with which to add filters to an image. e.g polaroid, lomograph"; |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the regular expression to search strings for.
|
|||
/// </summary>
|
|||
public Regex RegexPattern |
|||
{ |
|||
get |
|||
{ |
|||
return QueryRegex; |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets or sets DynamicParameter.
|
|||
/// </summary>
|
|||
public dynamic DynamicParameter |
|||
{ |
|||
get; |
|||
set; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the order in which this processor is to be used in a chain.
|
|||
/// </summary>
|
|||
public int SortOrder |
|||
{ |
|||
get; |
|||
private set; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets or sets any additional settings required by the processor.
|
|||
/// </summary>
|
|||
public Dictionary<string, string> Settings |
|||
{ |
|||
get; |
|||
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; |
|||
|
|||
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; |
|||
this.DynamicParameter = match.Value.Split('=')[1]; |
|||
} |
|||
|
|||
index += 1; |
|||
} |
|||
} |
|||
|
|||
return this.SortOrder; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Processes the image.
|
|||
/// </summary>
|
|||
/// <param name="factory">
|
|||
/// The the current instance of the <see cref="T:ImageProcessor.ImageFactory"/> class containing
|
|||
/// the image to process.
|
|||
/// </param>
|
|||
/// <returns>
|
|||
/// The processed image from the current instance of the <see cref="T:ImageProcessor.ImageFactory"/> class.
|
|||
/// </returns>
|
|||
public Image ProcessImage(ImageFactory factory) |
|||
{ |
|||
Bitmap newImage = null; |
|||
Image image = factory.Image; |
|||
|
|||
// Bitmaps for comic pattern
|
|||
Bitmap hisatchBitmap = null; |
|||
Bitmap patternBitmap = null; |
|||
|
|||
try |
|||
{ |
|||
// Dont use an object initializer here.
|
|||
newImage = new Bitmap(image.Width, image.Height, PixelFormat.Format32bppPArgb); |
|||
newImage.Tag = image.Tag; |
|||
|
|||
ColorMatrix colorMatrix = null; |
|||
|
|||
switch ((string)this.DynamicParameter) |
|||
{ |
|||
case "polaroid": |
|||
colorMatrix = ColorMatrixes.Polaroid; |
|||
break; |
|||
case "lomograph": |
|||
colorMatrix = ColorMatrixes.Lomograph; |
|||
break; |
|||
case "sepia": |
|||
colorMatrix = ColorMatrixes.Sepia; |
|||
break; |
|||
case "blackwhite": |
|||
colorMatrix = ColorMatrixes.BlackWhite; |
|||
break; |
|||
case "greyscale": |
|||
colorMatrix = ColorMatrixes.GreyScale; |
|||
break; |
|||
case "gotham": |
|||
colorMatrix = ColorMatrixes.Gotham; |
|||
break; |
|||
case "invert": |
|||
colorMatrix = ColorMatrixes.Invert; |
|||
break; |
|||
case "hisatch": |
|||
colorMatrix = ColorMatrixes.HiSatch; |
|||
break; |
|||
case "losatch": |
|||
colorMatrix = ColorMatrixes.LoSatch; |
|||
break; |
|||
case "comic": |
|||
colorMatrix = ColorMatrixes.LoSatch; |
|||
break; |
|||
} |
|||
|
|||
using (Graphics graphics = Graphics.FromImage(newImage)) |
|||
{ |
|||
using (ImageAttributes attributes = new ImageAttributes()) |
|||
{ |
|||
if (colorMatrix != null) |
|||
{ |
|||
attributes.SetColorMatrix(colorMatrix); |
|||
} |
|||
|
|||
Rectangle rectangle = new Rectangle(0, 0, image.Width, image.Height); |
|||
|
|||
if (this.DynamicParameter == "comic") |
|||
{ |
|||
// Set the attributes to LoSatch and draw the image.
|
|||
graphics.DrawImage(image, rectangle, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, attributes); |
|||
|
|||
// Create a bitmap for overlaying.
|
|||
hisatchBitmap = new Bitmap(rectangle.Width, rectangle.Height, PixelFormat.Format32bppPArgb); |
|||
|
|||
// Set the color matrix
|
|||
attributes.SetColorMatrix(ColorMatrixes.HiSatch); |
|||
|
|||
// Draw the image with the hisatch colormatrix.
|
|||
using (var g = Graphics.FromImage(hisatchBitmap)) |
|||
{ |
|||
g.DrawImage(image, rectangle, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, attributes); |
|||
} |
|||
|
|||
// We need to create a new image now with the hi saturation colormatrix and a pattern mask to paint it
|
|||
// onto the other image with.
|
|||
patternBitmap = new Bitmap(rectangle.Width, rectangle.Height, PixelFormat.Format32bppPArgb); |
|||
|
|||
// Create the pattern mask.
|
|||
using (var g = Graphics.FromImage(patternBitmap)) |
|||
{ |
|||
g.Clear(Color.Black); |
|||
g.SmoothingMode = SmoothingMode.HighQuality; |
|||
for (var y = 0; y < image.Height; y += 10) |
|||
{ |
|||
for (var x = 0; x < image.Width; x += 6) |
|||
{ |
|||
g.FillEllipse(Brushes.White, x, y, 4, 4); |
|||
g.FillEllipse(Brushes.White, x + 3, y + 5, 4, 4); |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Transfer the alpha channel from the mask to the hi sturation image.
|
|||
TransferOneArgbChannelFromOneBitmapToAnother(patternBitmap, hisatchBitmap, ChannelArgb.Blue, ChannelArgb.Alpha); |
|||
|
|||
// Overlay the image.
|
|||
graphics.DrawImage(hisatchBitmap, 0, 0); |
|||
|
|||
// Dispose of the other images
|
|||
hisatchBitmap.Dispose(); |
|||
patternBitmap.Dispose(); |
|||
} |
|||
else |
|||
{ |
|||
graphics.DrawImage(image, rectangle, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, attributes); |
|||
|
|||
// Polaroid requires an extra tweak.
|
|||
if (this.DynamicParameter == "polaroid") |
|||
{ |
|||
using (GraphicsPath path = new GraphicsPath()) |
|||
{ |
|||
path.AddEllipse(rectangle); |
|||
using (PathGradientBrush brush = new PathGradientBrush(path)) |
|||
{ |
|||
// Fill a rectangle with an elliptical gradient brush that goes from orange to transparent.
|
|||
// This has the effect of painting the far corners transparent and fading in to orange on the
|
|||
// way in to the centre.
|
|||
brush.WrapMode = WrapMode.Tile; |
|||
brush.CenterColor = Color.FromArgb(70, 255, 153, 102); |
|||
brush.SurroundColors = new Color[] { Color.FromArgb(0, 0, 0, 0) }; |
|||
|
|||
Blend blend = new Blend |
|||
{ |
|||
Positions = new float[] { 0.0f, 0.2f, 0.4f, 0.6f, 0.8f, 1.0F }, |
|||
Factors = new float[] { 0.0f, 0.5f, 1f, 1f, 1.0f, 1.0f } |
|||
}; |
|||
|
|||
brush.Blend = blend; |
|||
|
|||
Region oldClip = graphics.Clip; |
|||
graphics.Clip = new Region(rectangle); |
|||
graphics.FillRectangle(brush, rectangle); |
|||
graphics.Clip = oldClip; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Gotham requires an extra tweak.
|
|||
if (this.DynamicParameter == "gotham") |
|||
{ |
|||
using (GraphicsPath path = new GraphicsPath()) |
|||
{ |
|||
path.AddRectangle(rectangle); |
|||
|
|||
// Paint a burgundy rectangle with a transparency of ~30% over the image.
|
|||
// Paint a blue rectangle with a transparency of 20% over the image.
|
|||
using (SolidBrush brush = new SolidBrush(Color.FromArgb(77, 43, 4, 18))) |
|||
{ |
|||
Region oldClip = graphics.Clip; |
|||
graphics.Clip = new Region(rectangle); |
|||
graphics.FillRectangle(brush, rectangle); |
|||
|
|||
// Fill the blue.
|
|||
brush.Color = Color.FromArgb(51, 12, 22, 88); |
|||
graphics.FillRectangle(brush, rectangle); |
|||
graphics.Clip = oldClip; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Add a vignette to finish the effect.
|
|||
// TODO: This feels a bit mucky so I might chop it out.
|
|||
if (this.DynamicParameter == "polaroid" || this.DynamicParameter == "lomograph") |
|||
{ |
|||
factory.Image = newImage; |
|||
Vignette vignette = new Vignette(); |
|||
newImage = (Bitmap)vignette.ProcessImage(factory); |
|||
} |
|||
|
|||
// Reassign the image.
|
|||
image.Dispose(); |
|||
image = newImage; |
|||
} |
|||
catch |
|||
{ |
|||
if (newImage != null) |
|||
{ |
|||
newImage.Dispose(); |
|||
} |
|||
|
|||
if (hisatchBitmap != null) |
|||
{ |
|||
hisatchBitmap.Dispose(); |
|||
} |
|||
|
|||
if (patternBitmap != null) |
|||
{ |
|||
patternBitmap.Dispose(); |
|||
} |
|||
} |
|||
|
|||
return image; |
|||
} |
|||
#endregion
|
|||
|
|||
/// <summary>
|
|||
/// Transfers a single ARGB channel from one image to another.
|
|||
/// </summary>
|
|||
/// <param name="source">
|
|||
/// The source.
|
|||
/// </param>
|
|||
/// <param name="destination">
|
|||
/// The destination.
|
|||
/// </param>
|
|||
/// <param name="sourceChannel">
|
|||
/// The source channel.
|
|||
/// </param>
|
|||
/// <param name="destinationChannel">
|
|||
/// The destination channel.
|
|||
/// </param>
|
|||
private static void TransferOneArgbChannelFromOneBitmapToAnother(Bitmap source, Bitmap destination, ChannelArgb sourceChannel, ChannelArgb destinationChannel) |
|||
{ |
|||
if (source.Size != destination.Size) |
|||
{ |
|||
throw new ArgumentException(); |
|||
} |
|||
|
|||
Rectangle rectangle = new Rectangle(Point.Empty, source.Size); |
|||
|
|||
// Lockbits the source.
|
|||
BitmapData bitmapDataSource = source.LockBits(rectangle, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); |
|||
|
|||
// Declare an array to hold the bytes of the bitmap.
|
|||
int bytes = bitmapDataSource.Stride * bitmapDataSource.Height; |
|||
|
|||
// Allocate a buffer for the source image
|
|||
byte[] sourceRgbValues = new byte[bytes]; |
|||
|
|||
// Copy the RGB values into the array.
|
|||
System.Runtime.InteropServices.Marshal.Copy(bitmapDataSource.Scan0, sourceRgbValues, 0, bytes); |
|||
|
|||
// Unlockbits the source.
|
|||
source.UnlockBits(bitmapDataSource); |
|||
|
|||
// Lockbits the destination.
|
|||
BitmapData bitmapDataDestination = destination.LockBits(rectangle, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); |
|||
|
|||
// Allocate a buffer for image
|
|||
byte[] destinationRgbValues = new byte[bytes]; |
|||
|
|||
// Copy the RGB values into the array.
|
|||
System.Runtime.InteropServices.Marshal.Copy(bitmapDataDestination.Scan0, destinationRgbValues, 0, bytes); |
|||
|
|||
int s = (int)sourceChannel; |
|||
int d = (int)destinationChannel; |
|||
|
|||
for (int i = rectangle.Height * rectangle.Width; i > 0; i--) |
|||
{ |
|||
destinationRgbValues[d] = sourceRgbValues[s]; |
|||
d += 4; |
|||
s += 4; |
|||
} |
|||
|
|||
// Copy the RGB values back to the bitmap
|
|||
System.Runtime.InteropServices.Marshal.Copy(destinationRgbValues, 0, bitmapDataDestination.Scan0, bytes); |
|||
|
|||
// Unlock bits the destination.
|
|||
destination.UnlockBits(bitmapDataDestination); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// A list of available color matrices to apply to an image.
|
|||
/// </summary>
|
|||
private static class ColorMatrixes |
|||
{ |
|||
/// <summary>
|
|||
/// Gets Sepia.
|
|||
/// </summary>
|
|||
internal static ColorMatrix Sepia |
|||
{ |
|||
get |
|||
{ |
|||
return new ColorMatrix( |
|||
new float[][] |
|||
{ |
|||
new float[] { .393f, .349f, .272f, 0, 0 }, |
|||
new float[] { .769f, .686f, .534f, 0, 0 }, |
|||
new float[] { .189f, .168f, .131f, 0, 0 }, |
|||
new float[] { 0, 0, 0, 1, 0 }, |
|||
new float[] { 0, 0, 0, 0, 1 } |
|||
}); |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets BlackWhite.
|
|||
/// </summary>
|
|||
internal static ColorMatrix BlackWhite |
|||
{ |
|||
get |
|||
{ |
|||
return new ColorMatrix( |
|||
new float[][] |
|||
{ |
|||
new float[] { 1.5f, 1.5f, 1.5f, 0, 0 }, |
|||
new float[] { 1.5f, 1.5f, 1.5f, 0, 0 }, |
|||
new float[] { 1.5f, 1.5f, 1.5f, 0, 0 }, |
|||
new float[] { 0, 0, 0, 1, 0 }, |
|||
new float[] { -1, -1, -1, 0, 1 } |
|||
}); |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets Polaroid.
|
|||
/// </summary>
|
|||
internal static ColorMatrix Polaroid |
|||
{ |
|||
get |
|||
{ |
|||
return new ColorMatrix( |
|||
new float[][] |
|||
{ |
|||
new float[] { 1.638f, -0.062f, -0.262f, 0, 0 }, |
|||
new float[] { -0.122f, 1.378f, -0.122f, 0, 0 }, |
|||
new float[] { 1.016f, -0.016f, 1.383f, 0, 0 }, |
|||
new float[] { 0, 0, 0, 1, 0 }, |
|||
new float[] { 0.06f, -0.05f, -0.05f, 0, 1 } |
|||
}); |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets Lomograph.
|
|||
/// </summary>
|
|||
internal static ColorMatrix Lomograph |
|||
{ |
|||
get |
|||
{ |
|||
return new ColorMatrix( |
|||
new float[][] |
|||
{ |
|||
new float[] { 1.50f, 0, 0, 0, 0 }, |
|||
new float[] { 0, 1.45f, 0, 0, 0 }, |
|||
new float[] { 0, 0, 1.09f, 0, 0 }, |
|||
new float[] { 0, 0, 0, 1, 0 }, |
|||
new float[] { -0.10f, 0.05f, -0.08f, 0, 1 } |
|||
}); |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets GreyScale.
|
|||
/// </summary>
|
|||
internal static ColorMatrix GreyScale |
|||
{ |
|||
get |
|||
{ |
|||
return new ColorMatrix( |
|||
new float[][] |
|||
{ |
|||
new float[] { .33f, .33f, .33f, 0, 0 }, |
|||
new float[] { .59f, .59f, .59f, 0, 0 }, |
|||
new float[] { .11f, .11f, .11f, 0, 0 }, |
|||
new float[] { 0, 0, 0, 1, 0 }, |
|||
new float[] { 0, 0, 0, 0, 1 } |
|||
}); |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets Gotham.
|
|||
/// </summary>
|
|||
internal static ColorMatrix Gotham |
|||
{ |
|||
get |
|||
{ |
|||
return new ColorMatrix( |
|||
new float[][] |
|||
{ |
|||
new float[] { .9f, .9f, .9f, 0, 0 }, |
|||
new float[] { .9f, .9f, .9f, 0, 0 }, |
|||
new float[] { .9f, .9f, .9f, 0, 0 }, |
|||
new float[] { 0, 0, 0, 1, 0 }, |
|||
new float[] { -.5f, -.5f, -.45f, 0, 1 } |
|||
}); |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets Invert.
|
|||
/// </summary>
|
|||
internal static ColorMatrix Invert |
|||
{ |
|||
get |
|||
{ |
|||
return new ColorMatrix( |
|||
new float[][] |
|||
{ |
|||
new float[] { -1, 0, 0, 0, 0 }, |
|||
new float[] { 0, -1, 0, 0, 0 }, |
|||
new float[] { 0, 0, -1, 0, 0 }, |
|||
new float[] { 0, 0, 0, 1, 0 }, |
|||
new float[] { 1, 1, 1, 0, 1 } |
|||
}); |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets HiSatch.
|
|||
/// </summary>
|
|||
internal static ColorMatrix HiSatch |
|||
{ |
|||
get |
|||
{ |
|||
return new ColorMatrix( |
|||
new float[][] |
|||
{ |
|||
new float[] { 3, -1, -1, 0, 0 }, |
|||
new float[] { -1, 3, -1, 0, 0 }, |
|||
new float[] { -1, -1, 3, 0, 0 }, |
|||
new float[] { 0, 0, 0, 1, 0 }, |
|||
new float[] { 0, 0, 0, 0, 1 } |
|||
}); |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets LoSatch.
|
|||
/// </summary>
|
|||
internal static ColorMatrix LoSatch |
|||
{ |
|||
get |
|||
{ |
|||
return new ColorMatrix( |
|||
new float[][] |
|||
{ |
|||
new float[] { 1, 0, 0, 0, 0 }, |
|||
new float[] { 0, 1, 0, 0, 0 }, |
|||
new float[] { 0, 0, 1, 0, 0 }, |
|||
new float[] { 0, 0, 0, 1, 0 }, |
|||
new float[] { .25f, .25f, .25f, 0, 1 } |
|||
}); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -1,147 +0,0 @@ |
|||
// -----------------------------------------------------------------------
|
|||
// <copyright file="Class1.cs" company="">
|
|||
// TODO: Update copyright text.
|
|||
// </copyright>
|
|||
// -----------------------------------------------------------------------
|
|||
|
|||
namespace ImageProcessor.Processors |
|||
{ |
|||
using System; |
|||
using System.Collections; |
|||
using System.Collections.Generic; |
|||
using System.Drawing; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Text.RegularExpressions; |
|||
using ImageProcessor.Imaging; |
|||
|
|||
/// <summary>
|
|||
/// TODO: Update summary.
|
|||
/// </summary>
|
|||
public class Png8 : IGraphicsProcessor |
|||
{ |
|||
#region Implementation of IGraphicsProcessor
|
|||
|
|||
/// <summary>
|
|||
/// Gets the name.
|
|||
/// </summary>
|
|||
public string Name |
|||
{ |
|||
get |
|||
{ |
|||
throw new NotImplementedException(); |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the description.
|
|||
/// </summary>
|
|||
public string Description |
|||
{ |
|||
get |
|||
{ |
|||
throw new NotImplementedException(); |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the regular expression to search strings for.
|
|||
/// </summary>
|
|||
public Regex RegexPattern |
|||
{ |
|||
get |
|||
{ |
|||
throw new NotImplementedException(); |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets DynamicParameter.
|
|||
/// </summary>
|
|||
public dynamic DynamicParameter |
|||
{ |
|||
get |
|||
{ |
|||
throw new NotImplementedException(); |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the order in which this processor is to be used in a chain.
|
|||
/// </summary>
|
|||
public int SortOrder |
|||
{ |
|||
get |
|||
{ |
|||
throw new NotImplementedException(); |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets or sets any additional settings required by the processor.
|
|||
/// </summary>
|
|||
public Dictionary<string, string> Settings |
|||
{ |
|||
get |
|||
{ |
|||
throw new NotImplementedException(); |
|||
} |
|||
set |
|||
{ |
|||
throw new NotImplementedException(); |
|||
} |
|||
} |
|||
|
|||
/// <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) |
|||
{ |
|||
throw new NotImplementedException(); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Processes the image.
|
|||
/// </summary>
|
|||
/// <param name="factory">
|
|||
/// The the current instance of the <see cref="T:ImageProcessor.ImageFactory"/> class containing
|
|||
/// the image to process.
|
|||
/// </param>
|
|||
/// <returns>
|
|||
/// The processed image from the current instance of the <see cref="T:ImageProcessor.ImageFactory"/> class.
|
|||
/// </returns>
|
|||
public Image ProcessImage(ImageFactory factory) |
|||
{ |
|||
Bitmap newImage = null; |
|||
Image image = factory.Image; |
|||
try |
|||
{ |
|||
newImage = new Bitmap(image) { Tag = image.Tag }; |
|||
using (Graphics graphics = Graphics.FromImage(newImage)) |
|||
{ |
|||
ArrayList pallete = new ArrayList(); |
|||
PaletteQuantizer paletteQuantizer = new PaletteQuantizer(new ArrayList(newImage.Palette.Entries)); |
|||
newImage = paletteQuantizer.Quantize(newImage); |
|||
} |
|||
|
|||
} |
|||
catch |
|||
{ |
|||
if (newImage != null) |
|||
{ |
|||
newImage.Dispose(); |
|||
} |
|||
} |
|||
|
|||
return image; |
|||
} |
|||
|
|||
#endregion
|
|||
} |
|||
} |
|||
Binary file not shown.
Binary file not shown.
Loading…
Reference in new issue