|
@@ -53,6 +53,76 @@ namespace Admin.Tools.Captcha
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private void ReadPixel(Bitmap img, int x, int y, int[] pixels)
|
|
|
+ {
|
|
|
+ int xStart = x - 1;
|
|
|
+ int yStart = y - 1;
|
|
|
+ int current = 0;
|
|
|
+ for (int i = xStart; i < 3 + xStart; i++)
|
|
|
+ {
|
|
|
+ for (int j = yStart; j < 3 + yStart; j++)
|
|
|
+ {
|
|
|
+ int tx = i;
|
|
|
+ if (tx < 0)
|
|
|
+ {
|
|
|
+ tx = -tx;
|
|
|
+
|
|
|
+ }
|
|
|
+ else if (tx >= img.Width)
|
|
|
+ {
|
|
|
+ tx = x;
|
|
|
+ }
|
|
|
+ int ty = j;
|
|
|
+ if (ty < 0)
|
|
|
+ {
|
|
|
+ ty = -ty;
|
|
|
+ }
|
|
|
+ else if (ty >= img.Height)
|
|
|
+ {
|
|
|
+ ty = y;
|
|
|
+ }
|
|
|
+ pixels[current++] = img.GetPixel(tx, ty).ToArgb();
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void FillMatrix(int[][] matrix, int[] values)
|
|
|
+ {
|
|
|
+ int filled = 0;
|
|
|
+ for (int i = 0; i < matrix.Length; i++)
|
|
|
+ {
|
|
|
+ int[] x = matrix[i];
|
|
|
+ for (int j = 0; j < x.Length; j++)
|
|
|
+ {
|
|
|
+ x[j] = values[filled++];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private Color AvgMatrix(int[][] matrix)
|
|
|
+ {
|
|
|
+ int r = 0;
|
|
|
+ int g = 0;
|
|
|
+ int b = 0;
|
|
|
+ for (int i = 0; i < matrix.Length; i++)
|
|
|
+ {
|
|
|
+ int[] x = matrix[i];
|
|
|
+ for (int j = 0; j < x.Length; j++)
|
|
|
+ {
|
|
|
+ if (j == 1)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ Color c = Color.FromArgb(x[j]);
|
|
|
+ r += c.R;
|
|
|
+ g += c.G;
|
|
|
+ b += c.B;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return Color.FromArgb(r / 8, g / 8, b / 8);
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 根据模板生成拼图
|
|
|
/// </summary>
|
|
@@ -73,6 +143,10 @@ namespace Admin.Tools.Captcha
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // 临时数组遍历用于高斯模糊存周边像素值
|
|
|
+ int[][] martrix = { new int[3], new int[3], new int[3] };
|
|
|
+ int[] values = new int[9];
|
|
|
+
|
|
|
int xLength = templateImage.Width;
|
|
|
int yLength = templateImage.Height;
|
|
|
// 模板图像宽度
|
|
@@ -90,7 +164,12 @@ namespace Admin.Tools.Captcha
|
|
|
newImage.SetPixel(i, y + j, oriImageColor);
|
|
|
|
|
|
//抠图区域半透明
|
|
|
- baseImage.SetPixel(x + i, y + j, Color.FromArgb(120, oriImageColor.R, oriImageColor.G, oriImageColor.B));
|
|
|
+ //baseImage.SetPixel(x + i, y + j, Color.FromArgb(120, oriImageColor.R, oriImageColor.G, oriImageColor.B));
|
|
|
+
|
|
|
+ //抠图区域高斯模糊
|
|
|
+ ReadPixel(baseImage, x + i, y + j, values);
|
|
|
+ FillMatrix(martrix, values);
|
|
|
+ baseImage.SetPixel(x + i, y + j, AvgMatrix(martrix));
|
|
|
}
|
|
|
|
|
|
//防止数组越界判断
|
|
@@ -121,6 +200,10 @@ namespace Admin.Tools.Captcha
|
|
|
/// <param name="y"></param>
|
|
|
private void InterferenceByTemplate(Bitmap baseImage, Bitmap templateImage, int x, int y)
|
|
|
{
|
|
|
+ // 临时数组遍历用于高斯模糊存周边像素值
|
|
|
+ int[][] martrix = { new int[3], new int[3], new int[3] };
|
|
|
+ int[] values = new int[9];
|
|
|
+
|
|
|
int xLength = templateImage.Width;
|
|
|
int yLength = templateImage.Height;
|
|
|
// 模板图像宽度
|
|
@@ -136,7 +219,12 @@ namespace Admin.Tools.Captcha
|
|
|
Color oriImageColor = baseImage.GetPixel(x + i, y + j);
|
|
|
|
|
|
//抠图区域半透明
|
|
|
- baseImage.SetPixel(x + i, y + j, Color.FromArgb(120, oriImageColor.R, oriImageColor.G, oriImageColor.B));
|
|
|
+ //baseImage.SetPixel(x + i, y + j, Color.FromArgb(120, oriImageColor.R, oriImageColor.G, oriImageColor.B));
|
|
|
+
|
|
|
+ //抠图区域高斯模糊
|
|
|
+ ReadPixel(baseImage, x + i, y + j, values);
|
|
|
+ FillMatrix(martrix, values);
|
|
|
+ baseImage.SetPixel(x + i, y + j, AvgMatrix(martrix));
|
|
|
}
|
|
|
|
|
|
//防止数组越界判断
|
|
@@ -156,7 +244,6 @@ namespace Admin.Tools.Captcha
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/// <summary>
|
|
|
/// 更改图片尺寸
|
|
|
/// </summary>
|