而获取特征去干扰颜色是个大问题.有的网站做的很好.比如百度贴吧,例如地址是
http://post.baidu.com/cgi-bin/genimg?91647C2AB18B9A40CE2720CD224E6EB24489D2AFF2D9BB2001D3F806FB1E3E8E700721061042B3F4A939B8AE3CFC460801E89A9CA0DC7A69599AE489DABB
图形字符总是3M36,但是位置一直变.http://post.baidu.com/cgi-bin/genimg?后面的参数应该是加密数据.每次改变图片地址.而且虽然图形自由两种颜色,但是干扰得非常好.
对于颜色乱七杂八的色彩有些反而是很好过滤的.比如CSDN的论坛登陆验证码.例如地址
http://passport.csdn.net/ShowExPwd.aspx?DateTime=2007-1-24 16:23:53&strimg=0.8194541912990922
不知道日期后面的参数有什么用,http://passport.csdn.net/ShowExPwd.aspx?DateTime=2007-1-24照样可以抓取到图形的.但是这个抓出来颜色很杂.
1 public Stream ReuestImage()
2 {
3 HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create("http://passport.csdn.net/ShowExPwd.aspx?DateTime=2007-1-24");
4 hwr.ContentType = "application/x-www-form-urlencoded";
5 hwr.Method = "GET";
6 HttpWebResponse hw = (HttpWebResponse)hwr.GetResponse();
7 return hw.GetResponseStream();
8 }
2 {
3 HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create("http://passport.csdn.net/ShowExPwd.aspx?DateTime=2007-1-24");
4 hwr.ContentType = "application/x-www-form-urlencoded";
5 hwr.Method = "GET";
6 HttpWebResponse hw = (HttpWebResponse)hwr.GetResponse();
7 return hw.GetResponseStream();
8 }
1 /// <summary>
2 /// 加载图形,象素转换为数组
3 /// </summary>
4 private void Load()
5 {
6 MyNet mn = new MyNet();
7 bt = (Bitmap)Bitmap.FromStream(mn.ReuestImage());
8 //bt = (Bitmap)Bitmap.FromFile("c:/tt.bmp");
9 int x = bt.Width;
10 int y = bt.Height;
11 pixColor = new Color[x , y];
12
13 for (int i = 0; i < x; i++)
14 {
15 for (int k = 0; k < y; k++)
16 {
17 pixColor[i,k] = bt.GetPixel(i, k);
18 }
19 }
20 }
2 /// 加载图形,象素转换为数组
3 /// </summary>
4 private void Load()
5 {
6 MyNet mn = new MyNet();
7 bt = (Bitmap)Bitmap.FromStream(mn.ReuestImage());
8 //bt = (Bitmap)Bitmap.FromFile("c:/tt.bmp");
9 int x = bt.Width;
10 int y = bt.Height;
11 pixColor = new Color[x , y];
12
13 for (int i = 0; i < x; i++)
14 {
15 for (int k = 0; k < y; k++)
16 {
17 pixColor[i,k] = bt.GetPixel(i, k);
18 }
19 }
20 }
这样就抓出来图象,并且把每个象素点存放成数组了
我想了个简单的办法,用ColorTranslator.ToHtml把pixColor的每个点转换为#000000样式的颜色.去掉#
然后分成3份.
1 for (int i = 0; i < pixColor.GetLength(0); i++)
2 {
3 for (int j = 0; j < pixColor.GetLength(1); j++)
4 {
5 string s = ColorTranslator.ToHtml(pixColor[i, j]).Remove(0,1);
6 string s1 = s.Remove(2);
7 string s2 = s.Remove(0, 2).Remove(2);
8 string s3 = s.Remove(0, 4);
9
10 if (Convert.ToInt32(s1, 16) + Convert.ToInt32(s2, 16) + Convert.ToInt32(s3, 16) < 408)
11 bt.SetPixel(i, j, Color.White);
12 else
13 bt.SetPixel(i,j,Color.Black);
14 }
15 }
2 {
3 for (int j = 0; j < pixColor.GetLength(1); j++)
4 {
5 string s = ColorTranslator.ToHtml(pixColor[i, j]).Remove(0,1);
6 string s1 = s.Remove(2);
7 string s2 = s.Remove(0, 2).Remove(2);
8 string s3 = s.Remove(0, 4);
9
10 if (Convert.ToInt32(s1, 16) + Convert.ToInt32(s2, 16) + Convert.ToInt32(s3, 16) < 408)
11 bt.SetPixel(i, j, Color.White);
12 else
13 bt.SetPixel(i,j,Color.Black);
14 }
15 }
分成3份后,转换为十进制.然后3个加起来和136*3比较
为什么是136*3呢?因为Convert.ToInt32("88", 16) = 136 //十六进制转换10进制
也就是相当于把#888888颜色标记成408.而如果Convert.ToInt32(s1, 16) + Convert.ToInt32(s2, 16) + Convert.ToInt32(s3, 16) < 408 就默认为浅颜色,而设置为白色bt.SetPixel(i, j, Color.White);
否则就是深颜色,设置为黑色bt.SetPixel(i,j,Color.Black);
以下是抓取处理后的几张效果图
有什么好的想法好的思路,还望大家指点