1: /// <summary>
2: /// Pixelates an image
3: /// </summary>
4: /// <param name="OriginalImage">Image to pixelate</param>
5: /// <param name="PixelSize">Size of the "pixels" in pixels</param>
6: /// <returns>A bitmap which is pixelated</returns>
7: public static Bitmap Pixelate(Bitmap OriginalImage, int PixelSize)
8: {
9: Bitmap NewBitmap = new Bitmap(OriginalImage.Width, OriginalImage.Height);
10: BitmapData NewData = Image.LockImage(NewBitmap);
11: BitmapData OldData = Image.LockImage(OriginalImage);
12: int NewPixelSize = Image.GetPixelSize(NewData);
13: int OldPixelSize = Image.GetPixelSize(OldData);
14: for (int x = 0; x < NewBitmap.Width; x += (PixelSize / 2))
15: {
16: int MinX = MathHelper.Clamp(x - (PixelSize / 2), NewBitmap.Width, 0);
17: int MaxX = MathHelper.Clamp(x + (PixelSize / 2), NewBitmap.Width, 0);
18: for (int y = 0; y < NewBitmap.Height; y += (PixelSize / 2))
19: {
20: int RValue = 0;
21: int GValue = 0;
22: int BValue = 0;
23: int MinY = MathHelper.Clamp(y - (PixelSize / 2), NewBitmap.Height, 0);
24: int MaxY = MathHelper.Clamp(y + (PixelSize / 2), NewBitmap.Height, 0);
25: for (int x2 = MinX; x2 < MaxX; ++x2)
26: {
27: for (int y2 = MinY; y2 < MaxY; ++y2)
28: {
29: Color Pixel = Image.GetPixel(OldData, x2, y2, OldPixelSize);
30: RValue += Pixel.R;
31: GValue += Pixel.G;
32: BValue += Pixel.B;
33: }
34: }
35: RValue = RValue / (PixelSize * PixelSize);
36: GValue = GValue / (PixelSize * PixelSize);
37: BValue = BValue / (PixelSize * PixelSize);
38: Color TempPixel = Color.FromArgb(RValue, GValue, BValue);
39: for (int x2 = MinX; x2 < MaxX; ++x2)
40: {
41: for (int y2 = MinY; y2 < MaxY; ++y2)
42: {
43: Image.SetPixel(NewData, x2, y2, TempPixel, NewPixelSize);
44: }
45: }
46: }
47: }
48: Image.UnlockImage(NewBitmap, NewData);
49: Image.UnlockImage(OriginalImage, OldData);
50: return NewBitmap;
51: }