Browse Source

Prepping for 2.0.0 release

Former-commit-id: b59ab2bde9a0cce9543992d66cc3297dee8efb45
pull/17/head
JimBobSquarePants 13 years ago
parent
commit
9b66b7aefd
  1. 7
      src/ImageProcessor.Tests/RegularExpressionUnitTests.cs
  2. 8
      src/ImageProcessor.Web/HttpModules/ImageProcessingModule.cs
  3. 4
      src/ImageProcessor.Web/Properties/AssemblyInfo.cs
  4. 8
      src/ImageProcessor/ImageFactory.cs
  5. 4
      src/ImageProcessor/Imaging/Filters/BlackWhiteMatrixFilter.cs
  6. 2
      src/ImageProcessor/Imaging/Filters/ComicMatrixFilter.cs
  7. 4
      src/ImageProcessor/Imaging/Filters/GothamMatrixFilter.cs
  8. 4
      src/ImageProcessor/Imaging/Filters/GreyScaleMatrixFilter.cs
  9. 4
      src/ImageProcessor/Imaging/Filters/HiSatchMatrixFilter.cs
  10. 2
      src/ImageProcessor/Imaging/Filters/IMatrixFilter.cs
  11. 4
      src/ImageProcessor/Imaging/Filters/InvertMatrixFilter.cs
  12. 4
      src/ImageProcessor/Imaging/Filters/LoSatchMatrixFilter.cs
  13. 4
      src/ImageProcessor/Imaging/Filters/LomographMatrixFilter.cs
  14. 4
      src/ImageProcessor/Imaging/Filters/PolaroidMatrixFilter.cs
  15. 4
      src/ImageProcessor/Imaging/Filters/SepiaMatrixFilter.cs
  16. 59
      src/ImageProcessor/Imaging/RotateLayer.cs
  17. 610
      src/ImageProcessor/Processors/Copy of Filter.cs
  18. 147
      src/ImageProcessor/Processors/Png8.cs
  19. 4
      src/ImageProcessor/Properties/AssemblyInfo.cs
  20. BIN
      src/Nuget/ImageProcessor.1.4.0.0.nupkg
  21. BIN
      src/Nuget/ImageProcessor.Web.2.0.0.0.nupkg
  22. 2
      src/Test/Test/Test.csproj

7
src/ImageProcessor.Tests/RegularExpressionUnitTests.cs

@ -18,8 +18,8 @@
[TestMethod]
public void TestAlphaRegex()
{
string querystring = "alpha=56";
int expected = 56;
const string querystring = "alpha=56";
const int expected = 56;
Alpha alpha = new Alpha();
alpha.MatchRegexIndex(querystring);
@ -60,6 +60,7 @@
[TestMethod]
public void TestRotateRegex()
{
// Why does this fail?
string querystring = "rotate=270";
RotateLayer expected = new RotateLayer
{
@ -72,8 +73,6 @@
RotateLayer actual = rotate.DynamicParameter;
Debug.Print("{0}{1}", actual.Angle, actual.BackgroundColor);
Assert.AreEqual<RotateLayer>(expected, actual);
}
#endregion

8
src/ImageProcessor.Web/HttpModules/ImageProcessingModule.cs

@ -11,6 +11,7 @@ namespace ImageProcessor.Web.HttpModules
using System;
using System.IO;
using System.Net;
using System.Reflection;
using System.Web;
using System.Web.Hosting;
using ImageProcessor.Helpers.Extensions;
@ -40,6 +41,11 @@ namespace ImageProcessor.Web.HttpModules
/// The object to lock against.
/// </summary>
private static readonly object SyncRoot = new object();
/// <summary>
/// The assembly version.
/// </summary>
private static readonly string AssemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString();
#endregion
#region IHttpModule Members
@ -232,6 +238,8 @@ namespace ImageProcessor.Web.HttpModules
response.ContentType = responseType;
response.AddHeader("Image-Served-By", "ImageProcessor/" + AssemblyVersion);
HttpCachePolicy cache = response.Cache;
cache.VaryByHeaders["Accept-Encoding"] = true;

4
src/ImageProcessor.Web/Properties/AssemblyInfo.cs

@ -31,5 +31,5 @@ using System.Runtime.InteropServices;
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("1.3.0.0")]
[assembly: AssemblyFileVersion("1.3.0.0")]
[assembly: AssemblyVersion("2.0.0.0")]
[assembly: AssemblyFileVersion("2.0.0.0")]

8
src/ImageProcessor/ImageFactory.cs

@ -77,7 +77,7 @@ namespace ImageProcessor
public string ImagePath { get; private set; }
/// <summary>
/// Gets the querystring params for web image manipulation.
/// Gets the query-string parameters for web image manipulation.
/// </summary>
public string QueryString { get; private set; }
@ -177,9 +177,9 @@ namespace ImageProcessor
#region Manipulation
/// <summary>
/// Adds a querystring to the image factory to allow autoprocessing of remote files.
/// Adds a query-string to the image factory to allow auto-processing of remote files.
/// </summary>
/// <param name="query">The querystring parameter to process.</param>
/// <param name="query">The query-string parameter to process.</param>
/// <returns>
/// The current instance of the <see cref="T:ImageProcessor.ImageFactory"/> class.
/// </returns>
@ -533,7 +533,7 @@ namespace ImageProcessor
/// <summary>
/// Uses the <see cref="T:ImageProcessor.Imaging.OctreeQuantizer"/>
/// to fix the colour palette of gif images.
/// to fix the color palette of gif images.
/// </summary>
private void FixGifs()
{

4
src/ImageProcessor/Imaging/Filters/BlackWhiteMatrixFilter.cs

@ -19,10 +19,10 @@ namespace ImageProcessor.Imaging.Filters
/// <summary>
/// Encapsulates methods with which to add a black and white filter to an image.
/// </summary>
class BlackWhiteMatrixFilter : IMatrixFilter
internal class BlackWhiteMatrixFilter : IMatrixFilter
{
/// <summary>
/// Gets the <see cref="T:System.Drawing.Imaging.ColoMatrix"/> for this filter instance.
/// Gets the <see cref="T:System.Drawing.Imaging.ColorMatrix"/> for this filter instance.
/// </summary>
public ColorMatrix Matrix
{

2
src/ImageProcessor/Imaging/Filters/ComicMatrixFilter.cs

@ -17,7 +17,7 @@ namespace ImageProcessor.Imaging.Filters
/// <summary>
/// Encapsulates methods with which to add a comic filter to an image.
/// </summary>
class ComicMatrixFilter : IMatrixFilter
internal class ComicMatrixFilter : IMatrixFilter
{
/// <summary>
/// Enumurates Argb colour channels.

4
src/ImageProcessor/Imaging/Filters/GothamMatrixFilter.cs

@ -20,10 +20,10 @@ namespace ImageProcessor.Imaging.Filters
/// <summary>
/// Encapsulates methods with which to add a gotham filter to an image.
/// </summary>
class GothamMatrixFilter : IMatrixFilter
internal class GothamMatrixFilter : IMatrixFilter
{
/// <summary>
/// Gets the <see cref="T:System.Drawing.Imaging.ColoMatrix"/> for this filter instance.
/// Gets the <see cref="T:System.Drawing.Imaging.ColorMatrix"/> for this filter instance.
/// </summary>
public ColorMatrix Matrix
{

4
src/ImageProcessor/Imaging/Filters/GreyScaleMatrixFilter.cs

@ -19,10 +19,10 @@ namespace ImageProcessor.Imaging.Filters
/// <summary>
/// Encapsulates methods with which to add a greyscale filter to an image.
/// </summary>
class GreyScaleMatrixFilter : IMatrixFilter
internal class GreyScaleMatrixFilter : IMatrixFilter
{
/// <summary>
/// Gets the <see cref="T:System.Drawing.Imaging.ColoMatrix"/> for this filter instance.
/// Gets the <see cref="T:System.Drawing.Imaging.ColorMatrix"/> for this filter instance.
/// </summary>
public ColorMatrix Matrix
{

4
src/ImageProcessor/Imaging/Filters/HiSatchMatrixFilter.cs

@ -19,10 +19,10 @@ namespace ImageProcessor.Imaging.Filters
/// <summary>
/// Encapsulates methods with which to add a high saturated filter to an image.
/// </summary>
class HiSatchMatrixFilter : IMatrixFilter
internal class HiSatchMatrixFilter : IMatrixFilter
{
/// <summary>
/// Gets the <see cref="T:System.Drawing.Imaging.ColoMatrix"/> for this filter instance.
/// Gets the <see cref="T:System.Drawing.Imaging.ColorMatrix"/> for this filter instance.
/// </summary>
public ColorMatrix Matrix
{

2
src/ImageProcessor/Imaging/Filters/IMatrixFilter.cs

@ -18,7 +18,7 @@ namespace ImageProcessor.Imaging.Filters
interface IMatrixFilter
{
/// <summary>
/// Gets the <see cref="T:System.Drawing.ColoMatrix"/> for this filter instance.
/// Gets the <see cref="T:System.Drawing.ColorMatrix"/> for this filter instance.
/// </summary>
ColorMatrix Matrix { get; }

4
src/ImageProcessor/Imaging/Filters/InvertMatrixFilter.cs

@ -19,10 +19,10 @@ namespace ImageProcessor.Imaging.Filters
/// <summary>
/// Encapsulates methods with which to add an inverted filter to an image.
/// </summary>
class InvertMatrixFilter : IMatrixFilter
internal class InvertMatrixFilter : IMatrixFilter
{
/// <summary>
/// Gets the <see cref="T:System.Drawing.Imaging.ColoMatrix"/> for this filter instance.
/// Gets the <see cref="T:System.Drawing.Imaging.ColorMatrix"/> for this filter instance.
/// </summary>
public ColorMatrix Matrix
{

4
src/ImageProcessor/Imaging/Filters/LoSatchMatrixFilter.cs

@ -19,10 +19,10 @@ namespace ImageProcessor.Imaging.Filters
/// <summary>
/// Encapsulates methods with which to add a low saturated filter to an image.
/// </summary>
class LoSatchMatrixFilter : IMatrixFilter
internal class LoSatchMatrixFilter : IMatrixFilter
{
/// <summary>
/// Gets the <see cref="T:System.Drawing.Imaging.ColoMatrix"/> for this filter instance.
/// Gets the <see cref="T:System.Drawing.Imaging.ColorMatrix"/> for this filter instance.
/// </summary>
public ColorMatrix Matrix
{

4
src/ImageProcessor/Imaging/Filters/LomographMatrixFilter.cs

@ -20,10 +20,10 @@ namespace ImageProcessor.Imaging.Filters
/// <summary>
/// Encapsulates methods with which to add a lomograph filter to an image.
/// </summary>
class LomographMatrixFilter : IMatrixFilter
internal class LomographMatrixFilter : IMatrixFilter
{
/// <summary>
/// Gets the <see cref="T:System.Drawing.Imaging.ColoMatrix"/> for this filter instance.
/// Gets the <see cref="T:System.Drawing.Imaging.ColorMatrix"/> for this filter instance.
/// </summary>
public ColorMatrix Matrix
{

4
src/ImageProcessor/Imaging/Filters/PolaroidMatrixFilter.cs

@ -21,10 +21,10 @@ namespace ImageProcessor.Imaging.Filters
/// <summary>
/// Encapsulates methods with which to add a polaroid filter to an image.
/// </summary>
class PolaroidMatrixFilter : IMatrixFilter
internal class PolaroidMatrixFilter : IMatrixFilter
{
/// <summary>
/// Gets the <see cref="T:System.Drawing.Imaging.ColoMatrix"/> for this filter instance.
/// Gets the <see cref="T:System.Drawing.Imaging.ColorMatrix"/> for this filter instance.
/// </summary>
public ColorMatrix Matrix
{

4
src/ImageProcessor/Imaging/Filters/SepiaMatrixFilter.cs

@ -19,10 +19,10 @@ namespace ImageProcessor.Imaging.Filters
/// <summary>
/// Encapsulates methods with which to add a sepia filter to an image.
/// </summary>
class SepiaMatrixFilter : IMatrixFilter
internal class SepiaMatrixFilter : IMatrixFilter
{
/// <summary>
/// Gets the <see cref="T:System.Drawing.Imaging.ColoMatrix"/> for this filter instance.
/// Gets the <see cref="T:System.Drawing.Imaging.ColorMatrix"/> for this filter instance.
/// </summary>
public ColorMatrix Matrix
{

59
src/ImageProcessor/Imaging/RotateLayer.cs

@ -8,13 +8,15 @@
namespace ImageProcessor.Imaging
{
#region Using
using System;
using System.Collections.Generic;
using System.Drawing;
#endregion
/// <summary>
/// Enacapsulates the properties required to rotate an image.
/// Encapsulates the properties required to rotate an image.
/// </summary>
public class RotateLayer
public class RotateLayer : IEqualityComparer<RotateLayer>
{
#region Constructors
/// <summary>
@ -37,5 +39,58 @@ namespace ImageProcessor.Imaging
/// </summary>
public Color BackgroundColor { get; set; }
#endregion
/// <summary>
/// Returns a value indicating whether this instance is equal to another <see cref="ImageProcessor.Imaging.RotateLayer"/>.
/// </summary>
/// <param name="other">
/// The other <see cref="ImageProcessor.Imaging.RotateLayer"/> to compare to.
/// </param>
/// <returns>
/// True if this instance is equal to another <see cref="ImageProcessor.Imaging.RotateLayer"/>; otherwise, false.
/// </returns>
public bool Equals(RotateLayer other)
{
return this.Angle.Equals(other.Angle) && this.BackgroundColor.Equals(other.BackgroundColor);
}
/// <summary>
/// Determines whether the specified objects are equal.
/// </summary>
/// <returns>
/// true if the specified objects are equal; otherwise, false.
/// </returns>
/// <param name="x">
/// The first object of type <see cref="ImageProcessor.Imaging.RotateLayer"/> to compare.
/// </param>
/// <param name="y">
/// The second object of type <see cref="ImageProcessor.Imaging.RotateLayer"/> to compare.
/// </param>
public bool Equals(RotateLayer x, RotateLayer y)
{
return x.Angle.Equals(y.Angle) && x.BackgroundColor.Equals(y.BackgroundColor);
}
/// <summary>
/// Returns a hash code for the specified object.
/// </summary>
/// <returns>
/// A hash code for the specified object.
/// </returns>
/// <param name="obj">
/// The <see cref="T:System.Object"/> for which a hash code is to be returned.
/// </param>
/// <exception cref="T:System.ArgumentNullException">
/// The type of <paramref name="obj"/> is a reference type and <paramref name="obj"/> is null.
/// </exception>
public int GetHashCode(RotateLayer obj)
{
if (obj == null)
{
throw new ArgumentNullException();
}
return this.Angle.GetHashCode() + this.BackgroundColor.GetHashCode();
}
}
}

610
src/ImageProcessor/Processors/Copy of Filter.cs

@ -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 }
});
}
}
}
}
}

147
src/ImageProcessor/Processors/Png8.cs

@ -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
}
}

4
src/ImageProcessor/Properties/AssemblyInfo.cs

@ -32,6 +32,6 @@ using System.Security;
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("1.3.0.0")]
[assembly: AssemblyFileVersion("1.3.0.0")]
[assembly: AssemblyVersion("1.4.0.0")]
[assembly: AssemblyFileVersion("1.4.0.0")]

BIN
src/Nuget/ImageProcessor.1.4.0.0.nupkg

Binary file not shown.

BIN
src/Nuget/ImageProcessor.Web.2.0.0.0.nupkg

Binary file not shown.

2
src/Test/Test/Test.csproj

@ -91,6 +91,8 @@
<Content Include="Images\Desert.jpg" />
<Content Include="Images\Lighthouse.jpg" />
<Content Include="Images\MSwanson - Wide Large - Rock 02.jpg" />
<Content Include="Images\negative.png" />
<Content Include="Images\negative2.png" />
<Content Include="Images\Penguins.bmp" />
<Content Include="Images\Penguins.gif" />
<Content Include="Images\Penguins.jpg" />

Loading…
Cancel
Save