62,074
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Web.UI.HtmlControls;
using mshtml;
using System.Drawing.Imaging;
namespace ReadImageCode
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private string url_1 = "http://www.fjjj.gov.cn/chs/jf_main.asp?t=1";
private string url_2 = "http://www.fjjj.gov.cn/article/getcode.asp";
private void Form1_Load(object sender, EventArgs e)
{
this.webBrowser1.Navigate(url_1);
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
HTMLDocument doc = (HTMLDocument)this.webBrowser1.Document.DomDocument;
IHTMLControlRange range = (IHTMLControlRange)((HTMLBody)doc.body).createControlRange();
IHTMLControlElement codeimg = null;
foreach (IHTMLImgElement img in doc.images)
{
if (img.src.ToLower().IndexOf(url_2.ToLower())!=-1)
codeimg = (IHTMLControlElement)img;
}
range.add(codeimg);
range.execCommand("Copy", false, null);
codeimg = null;
range = null;
doc = null;
if (Clipboard.ContainsImage())
{
this.pictureBox1.Image = Clipboard.GetImage();
MemoryStream ns = new MemoryStream();
this.pictureBox1.Image.Save(ns, ImageFormat.Bmp);
Bitmap sourcebm = (Bitmap)(Bitmap.FromStream(ns));
sourcebm=ConvertToGrayscale(sourcebm);
sourcebm = ConvertToMonochrome(sourcebm);
this.pictureBox1.Image = (Image)sourcebm;
string codestr = this.GetCodeString(sourcebm);
this.codeLabel.Text = this.GetCodeNumber(codestr);//数字验证码
//this.textBox1.Text += codestr + System.Environment.NewLine + System.Environment.NewLine;
ns = null;
sourcebm = null;
}
else
{
MessageBox.Show("读取失败");
}
Clipboard.Clear();
}
private Bitmap ConvertToGrayscale(Bitmap sourcebm)
{
//将彩色转换为灰度
for (int x = 0; x < sourcebm.Width; x++)
{
for (int y = 0; y < sourcebm.Height; y++)
{
Color c = sourcebm.GetPixel(x, y);
int luma = (int)(c.R * 0.3 + c.G * 0.59 + c.B * 0.11);//转换灰度的算法
sourcebm.SetPixel(x, y, Color.FromArgb(luma, luma, luma));
}
}
return sourcebm;
}
byte critical_value = 238;//灰色背景色
private Bitmap ConvertToMonochrome(Bitmap sourcebm)
{
//去杂色,转换为黑白图片
for (int x = 0; x < sourcebm.Width; x++)
{
for (int y = 0; y < sourcebm.Height; y++)
{
Color c = sourcebm.GetPixel(x, y);
if (c.R == 238)
sourcebm.SetPixel(x, y, Color.FromArgb(255, 255, 255));
else
sourcebm.SetPixel(x, y, Color.FromArgb(0, 0, 0));
}
}
return sourcebm;
}
private string GetCodeString(Bitmap sourcebm)
{
int[] widthStartX = new int[40];//图片宽40像素
int[] widthEndX = new int[40];
bool myColumn = true;
bool charStart = true;
int charNum = 0;
for (int x = 0; x < sourcebm.Width; x++)
{
myColumn = true;
for (int y = 0; y < sourcebm.Height; y++)
{
Color c = sourcebm.GetPixel(x, y);
if (c.R == 0 && charStart == false)//第一次出现黑点
{
widthStartX[charNum] = x;
charStart = true;
break;
}
if (c.R == 0 && charStart == true)//后续出现黑点
{
myColumn = false;
break;
}
}
if (myColumn == true && charStart == true && widthStartX[charNum] < x)//如果当列没有黑点并且前面出现过黑点还没结束
{
widthEndX[charNum] = x - 1;
charStart = false;
charNum++;
}
if (charStart == true && myColumn == false && x == (sourcebm.Width - 1))//如果开始出现黑点了,并且最后一列也有黑点
{
widthEndX[charNum] = x;
charStart = false;
charNum++;
}
}
string str = "";
int sp = 0;
for (int x = 0; x < sourcebm.Width; x++)
{
for (int y = 0; y < sourcebm.Height; y++)
{
sp++;
Color c1 = sourcebm.GetPixel(x, y);
if (c1.R == 0)
str = str + "1";
else
str = str + "0";
if (sp == 100)
{
sp = 0;
str = str + "|";//由此可分析出数字组成部分,即numstr
}
}
}
return str;
}
private string GetCodeNumber(string str)
{
string[] num = str.Split('|');
return GetNum(num[0]) + GetNum(num[1]) + GetNum(num[2]) + GetNum(num[3]);
}
private string GetNum(string str)
{
string ret = "0";
for (int i = 0; i < numstr.Length; i++)
{
if (numstr[i] == str)
{
ret = i.ToString();
break;
}
}
return ret;
}
private string[] numstr = {
"0111111110100000000110000000011000000001100000000101111111100000000000000000000000000000000000000000",//0
"0100000001010000000111111111110000000001000000000100000000000000000000000000000000000000000000000000",//1
"0100000011100000010110000010011000010001100010000101110000010000000000000000000000000000000000000000",//2
"0100000010100000000110001000011000100001100010000101110111100000000000000000000000000000000000000000",//3
"0000011000000010100000110010000100001001111111111100000010010000000000000000000000000000000000000000",//4
"1111100010100010000110001000011000100001100010000110000111100000000000000000000000000000000000000000",//5
"0011111110010001000110001000011000100001100010000100000111100000000000000000000000000000000000000000",//6
"1100000000100000001110000011001000110000101100000011000000000000000000000000000000000000000000000000",//7
"0111011110100010000110001000011000100001100010000101110111100000000000000000000000000000000000000000",//8
"0111100000100001000110000100011000010001100010001001111111000000000000000000000000000000000000000000" //9
};
private void button1_Click(object sender, EventArgs e)
{
string url = url_1;
url = url + "&rnd=" + DateTime.Now.ToString();
this.webBrowser1.Navigate(url);
}
}
}