mirror of https://github.com/SixLabors/ImageSharp
4 changed files with 162 additions and 4 deletions
@ -0,0 +1,134 @@ |
|||||
|
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
// <copyright file="Pixelate.cs" company="James South">
|
||||
|
// Copyright (c) James South.
|
||||
|
// Licensed under the Apache License, Version 2.0.
|
||||
|
// </copyright>
|
||||
|
// <summary>
|
||||
|
// Encapsulates methods to pixelate an image.
|
||||
|
// </summary>
|
||||
|
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
|
||||
|
namespace ImageProcessor.Processors |
||||
|
{ |
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Drawing; |
||||
|
|
||||
|
using ImageProcessor.Common.Exceptions; |
||||
|
using ImageProcessor.Imaging; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Encapsulates methods to pixelate an image.
|
||||
|
/// </summary>
|
||||
|
public class Pixelate : IGraphicsProcessor |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Initializes a new instance of the <see cref="Pixelate"/> class.
|
||||
|
/// </summary>
|
||||
|
public Pixelate() |
||||
|
{ |
||||
|
this.Settings = new Dictionary<string, string>(); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Gets or sets the dynamic parameter.
|
||||
|
/// </summary>
|
||||
|
public dynamic DynamicParameter |
||||
|
{ |
||||
|
get; |
||||
|
set; |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Gets or sets any additional settings required by the processor.
|
||||
|
/// </summary>
|
||||
|
public Dictionary<string, string> Settings |
||||
|
{ |
||||
|
get; |
||||
|
set; |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Processes the image.
|
||||
|
/// </summary>
|
||||
|
/// <param name="factory">
|
||||
|
/// 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 |
||||
|
{ |
||||
|
Tuple<int, Rectangle?> parameters = this.DynamicParameter; |
||||
|
int size = parameters.Item1; |
||||
|
Rectangle rectangle = parameters.Item2.HasValue |
||||
|
? parameters.Item2.Value |
||||
|
: new Rectangle(0, 0, image.Width, image.Height); |
||||
|
int x = rectangle.X; |
||||
|
int y = rectangle.Y; |
||||
|
int offset = size / 2; |
||||
|
int width = rectangle.Width; |
||||
|
int height = rectangle.Height; |
||||
|
int maxWidth = image.Width; |
||||
|
int maxHeight = image.Height; |
||||
|
|
||||
|
newImage = new Bitmap(image); |
||||
|
|
||||
|
using (FastBitmap fastBitmap = new FastBitmap(newImage)) |
||||
|
{ |
||||
|
for (int i = x; i < x + width && i < maxWidth; i += size) |
||||
|
{ |
||||
|
for (int j = y; j < y + height && j < maxHeight; j += size) |
||||
|
{ |
||||
|
int offsetX = offset; |
||||
|
int offsetY = offset; |
||||
|
|
||||
|
// Make sure that the offset is within the boundary of the image.
|
||||
|
while (i + offsetX >= maxWidth) |
||||
|
{ |
||||
|
offsetX--; |
||||
|
} |
||||
|
|
||||
|
while (j + offsetY >= maxHeight) |
||||
|
{ |
||||
|
offsetY--; |
||||
|
} |
||||
|
|
||||
|
// Get the pixel color in the centre of the soon to be pixelated area.
|
||||
|
Color pixel = fastBitmap.GetPixel(i + offsetX, j + offsetY); |
||||
|
|
||||
|
// For each pixel in the pixelate size, set it to the centre color.
|
||||
|
for (int k = i; k < i + size && k < maxWidth; k++) |
||||
|
{ |
||||
|
for (int l = j; l < j + size && l < maxHeight; l++) |
||||
|
{ |
||||
|
fastBitmap.SetPixel(k, l, pixel); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
image.Dispose(); |
||||
|
image = newImage; |
||||
|
} |
||||
|
catch (Exception ex) |
||||
|
{ |
||||
|
if (newImage != null) |
||||
|
{ |
||||
|
newImage.Dispose(); |
||||
|
} |
||||
|
|
||||
|
throw new ImageProcessingException("Error processing image with " + this.GetType().Name, ex); |
||||
|
} |
||||
|
|
||||
|
return image; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue