//public Blur CustomBlur = new Blur(); //the use in Form1.cs for example: "layer1 = effects.CustomBlur.Gaussain(layer1, 10);" /// <summary> /// Convolves the specified image. /// </summary> /// <param name="image">The image.</param> /// <param name="kernel">The kernel.</param> /// <param name="kw">The kw.</param> /// <param name="kh">The kh.</param> /// <returns>BitmapWorker.</returns> static BitmapWorker Convolve(BitmapWorker image, float[,] kernel, int kw, int kh) { BitmapWorker temp = image.Clone(); // int kh = kernel; //int kw = kh; //kernel[0].Length / 2; int i = 0, j = 0, n = 0, m = 0, cr, cg, cb, ca, h = image.Height(), w = image.Width(); for (i = 0; i < h; i++) { for (j = 0; j < w; j++) { //kernel loop float r = 0, g = 0, b = 0, a = 0; for (n = -kh; n <= kh; n++) { for (m = -kw; m <= kw; m++) { if (i + n >= 0 && i + n < h) { if (j + m >= 0 && j + m < w) { float f = kernel[m + kw, n + kh]; if (f == 0) { continue; } Color colortemp = image.GetPixel(j + m, i + n); cr = colortemp.R; cg = colortemp.G; cb = colortemp.B; ca = colortemp.A; r += cr * f; g += cg * f; b += cb * f; a += ca * f; } } } } //kernel loop end temp.SetPixel(j, i, Color.FromArgb((int)Util.clamp(a, 0, 255), (int)Util.clamp(r, 0, 255), (int)Util.clamp(g, 0, 255), (int)Util.clamp(b, 0, 255))); } } return(temp); }
/// <summary> /// Fasts the box blur. /// </summary> /// <param name="img">The img.</param> /// <param name="radius">The radius.</param> /// <returns>BitmapWorker.</returns> private static BitmapWorker FastBoxBlur(BitmapWorker img, int radius) { int kSize = radius; if (kSize % 2 == 0) { kSize++; } BitmapWorker Hblur = img.Clone(); float Avg = (float)1 / kSize; for (int j = 0; j < img.Height(); j++) { float[] hSum = new float[] { 0f, 0f, 0f, 0f }; float[] iAvg = new float[] { 0f, 0f, 0f, 0f }; for (int x = 0; x < kSize; x++) { Color tmpColor = img.GetPixel(x, j); hSum[0] += tmpColor.A; hSum[1] += tmpColor.R; hSum[2] += tmpColor.G; hSum[3] += tmpColor.B; } iAvg[0] = hSum[0] * Avg; iAvg[1] = hSum[1] * Avg; iAvg[2] = hSum[2] * Avg; iAvg[3] = hSum[3] * Avg; for (int i = 0; i < img.Width(); i++) { if (i - kSize / 2 >= 0 && i + 1 + kSize / 2 < img.Width()) { Color tmp_pColor = img.GetPixel(i - kSize / 2, j); hSum[0] -= tmp_pColor.A; hSum[1] -= tmp_pColor.R; hSum[2] -= tmp_pColor.G; hSum[3] -= tmp_pColor.B; Color tmp_nColor = img.GetPixel(i + 1 + kSize / 2, j); hSum[0] += tmp_nColor.A; hSum[1] += tmp_nColor.R; hSum[2] += tmp_nColor.G; hSum[3] += tmp_nColor.B; // iAvg[0] = hSum[0] * Avg; iAvg[1] = hSum[1] * Avg; iAvg[2] = hSum[2] * Avg; iAvg[3] = hSum[3] * Avg; } Hblur.SetPixel(i, j, Color.FromArgb((int)iAvg[0], (int)iAvg[1], (int)iAvg[2], (int)iAvg[3])); } } BitmapWorker total = Hblur.Clone(); for (int i = 0; i < Hblur.Width(); i++) { float[] tSum = new float[] { 0f, 0f, 0f, 0f }; float[] iAvg = new float[] { 0f, 0f, 0f, 0f }; for (int y = 0; y < kSize; y++) { Color tmpColor = Hblur.GetPixel(i, y); tSum[0] += tmpColor.A; tSum[1] += tmpColor.R; tSum[2] += tmpColor.G; tSum[3] += tmpColor.B; } iAvg[0] = tSum[0] * Avg; iAvg[1] = tSum[1] * Avg; iAvg[2] = tSum[2] * Avg; iAvg[3] = tSum[3] * Avg; for (int j = 0; j < Hblur.Height(); j++) { if (j - kSize / 2 >= 0 && j + 1 + kSize / 2 < Hblur.Height()) { Color tmp_pColor = Hblur.GetPixel(i, j - kSize / 2); tSum[0] -= tmp_pColor.A; tSum[1] -= tmp_pColor.R; tSum[2] -= tmp_pColor.G; tSum[3] -= tmp_pColor.B; Color tmp_nColor = Hblur.GetPixel(i, j + 1 + kSize / 2); tSum[0] += tmp_nColor.A; tSum[1] += tmp_nColor.R; tSum[2] += tmp_nColor.G; tSum[3] += tmp_nColor.B; // iAvg[0] = tSum[0] * Avg; iAvg[1] = tSum[1] * Avg; iAvg[2] = tSum[2] * Avg; iAvg[3] = tSum[3] * Avg; } total.SetPixel(i, j, Color.FromArgb((int)iAvg[0], (int)iAvg[1], (int)iAvg[2], (int)iAvg[3])); } } return(total); }