static void ToGrey(Bitmap img1)
{
for (int i = 0; i < img1.Width; i++)
{
for (int j = 0; j < img1.Height; j++)
{
Color pixelColor = img1.GetPixel(i, j);
//计算灰度值
int grey = (int)(0.299 * pixelColor.R + 0.587 * pixelColor.G + 0.114 * pixelColor.B);
Color newColor = Color.FromArgb(grey, grey, grey);
img1.SetPixel(i, j, newColor);
}
}
}
static void Thresholding(Bitmap img1)
{
int[] histogram = new int[256];
int minGrayValue=255, maxGrayValue=0;
//求取直方图
for (int i = 0; i < img1.Width; i++)
{
for (int j = 0; j < img1.Height; j++)
{
Color pixelColor = img1.GetPixel(i, j);
histogram[pixelColor.R]++;
if (pixelColor.R > maxGrayValue) maxGrayValue = pixelColor.R;
if (pixelColor.R < minGrayValue) minGrayValue = pixelColor.R;
}
}
//迭代计算阀值
int threshold = -1;
int newThreshold = (minGrayValue + maxGrayValue) / 2;
for(int iterationTimes = 0; threshold != newThreshold && iterationTimes < 100; iterationTimes++)
{
threshold = newThreshold;
int lP1 =0;
int lP2 =0;
int lS1 = 0;
int lS2 = 0;
//求两个区域的灰度的平均值
for (int i = minGrayValue;i < threshold;i++)
{
lP1 += histogram[i] * i;
lS1 += histogram[i];
}
int mean1GrayValue = (lP1 / lS1);
for (int i = threshold+1;i < maxGrayValue;i++)
{
lP2 += histogram[i] * i;
lS2 += histogram[i];
}
int mean2GrayValue = (lP2 / lS2);
newThreshold = (mean1GrayValue + mean2GrayValue) / 2;
}
//计算二值化
for (int i = 0; i < img1.Width; i++)
{
for (int j = 0; j < img1.Height; j++)
{
Color pixelColor = img1.GetPixel(i, j);
if (pixelColor.R > threshold) img1.SetPixel(i, j, Color.FromArgb(255, 255, 255));
else img1.SetPixel(i, j, Color.FromArgb(0, 0, 0));
}
}
}
阅读全文
最近有个项目用到了表单验证,小编在项目完结后的这段时间把常用的JS表单验证demo整理了一下,和大家一起分享~~~
1. 长度限制
<p>1. 长度限制</p>
<form name=a onsubmit="return test()">
<textarea name="b" cols="40" rows="6" placeholder="不能超过50个字符!"></textarea>
<br />
<input type="submit" name="Submit" value="check">
</form>
<script language="javascript">
function test()
{
if(document.a.b.value.length>50)
{
alert("不能超过50个字符!");
document.a.b.focus();
return false;
}
}
</script>
2. 只能是汉字
<p>2. 只能是汉字 </p>
<input type="text" onblur="isChinese(this.value)" placeholder="请输入中文!" />
<script language="javascript">
function isChinese(obj){
var reg=/^[\u0391-\uFFE5]+$/;
if(obj!=""&&!reg.test(obj)){
alert('必须输入中文!');
return false;
}
}
</script>
以下demo中的HTML的结构与验证中文结构相似的,小编就只写js啦~~~
3. 只能是英文字母
<script type="text/javascript">
//验证只能是字母
function checkZm(zm){
var zmReg=/^[a-zA-Z]*$/;
if(zm!=""&&!zmReg.test(zm)){
alert("只能是英文字母!");
return false;
}
}
</script>
4. 只能是数字
<script language=javascript>
//验证只能为数字
function checkNumber(obj){
var reg = /^[0-9]+$/;
if(obj!=""&&!reg.test(obj)){
alert('只能输入数字!');
return false;
}
}
</script>
5. 只能是英文字母和数字
<script type="text/javascript">
//验证只能是字母和数字
function checkZmOrNum(zmnum){
var zmnumReg=/^[0-9a-zA-Z]*$/;
if(zmnum!=""&&!zmnumReg.test(zmnum)){
alert("只能输入是字母或者数字,请重新输入");
return false;
}
}
</script>
6. 检验时间大小(与当前时间比较)
<script type="text/javascript">
//检验时间大小(与当前时间比较)
function checkDate(obj){
var obj_value=obj.replace(/-/g,"/");//替换字符,变成标准格式(检验格式为:'2009-12-10')
// var obj_value=obj.replace("-","/");//替换字符,变成标准格式(检验格式为:'2010-12-10 11:12')
var date1=new Date(Date.parse(obj_value));
var date2=new Date();//取今天的日期
if(date1>date2){
alert("不能大于当前时间!");
return false;
}
}
</script>
7. 屏蔽关键字(这里屏蔽***和****)
<script type="text/javascript">
function test(obj) {
if((obj.indexOf ("***") == 0)||(obj.indexOf ("****") == 0)){
alert("屏蔽关键字(这里屏蔽***和****)!");
return false;}
}
</script>
8. 两次输入密码是否相同
<script type="text/javascript">
function check(){
with(document.all){
if(input1.value!=input2.value)
{
alert("密码不一致")
input1.value = "";
input2.value = "";
}
else {
alert("密码一致");
document.forms[0].submit();
}
}
}
</script>
9. 表单项不能为空
<script language="javascript">
function CheckForm(obj)
{
if (obj.length == 0) {
alert("姓名不能为空!");
return false;
}
return true;
alert("姓名不能为空!");
}
</script>
10. 邮箱验证
<script language="javascript">
function test(obj){
//对电子邮件的验证
var myreg = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/;
if(!myreg.test(obj))
{
alert('请输入有效的邮箱!');
return false;
}
}
</script>
11. 验证手机号
<script type="text/javascript">
function validatemobile(mobile)
{
if(mobile.length==0)
{
alert('手机号码不能为空!');
return false;
}
if(mobile.length!=11)
{
alert('请输入有效的手机号码,需是11位!');
return false;
}
var myreg = /^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1}))+\d{8})$/;
if(!myreg.test(mobile))
{
alert('请输入有效的手机号码!');
return false;
}
}
</script>
12. 验证身份证号码(需是有效身份证)
<script type="text/javascript">
// 构造函数,变量为15位或者18位的身份证号码
function clsIDCard(CardNo) {
this.Valid=false;
this.ID15='';
this.ID18='';
this.Local='';
if(CardNo!=null)this.SetCardNo(CardNo);
}
// 设置身份证号码,15位或者18位
clsIDCard.prototype.SetCardNo = function(CardNo) {
this.ID15='';
this.ID18='';
this.Local='';
CardNo=CardNo.replace(" ","");
var strCardNo;
if(CardNo.length==18) {
pattern= /^\d{17}(\d|x|X)$/;
if (pattern.exec(CardNo)==null)return;
strCardNo=CardNo.toUpperCase();
} else {
pattern= /^\d{15}$/;
if (pattern.exec(CardNo)==null)return;
strCardNo=CardNo.substr(0,6)+'19'+CardNo.substr(6,9)
strCardNo+=this.GetVCode(strCardNo);
}
this.Valid=this.CheckValid(strCardNo);
}
// 校验身份证有效性
clsIDCard.prototype.IsValid = function() {
return this.Valid;
}
// 返回生日字符串,格式如下,1981-10-10
clsIDCard.prototype.GetBirthDate = function() {
var BirthDate='';
if(this.Valid)BirthDate=this.GetBirthYear()+'-'+this.GetBirthMonth()+'-'+this.GetBirthDay();
return BirthDate;
}
// 返回生日中的年,格式如下,1981
clsIDCard.prototype.GetBirthYear = function() {
var BirthYear='';
if(this.Valid)BirthYear=this.ID18.substr(6,4);
return BirthYear;
}
// 返回生日中的月,格式如下,10
clsIDCard.prototype.GetBirthMonth = function() {
var BirthMonth='';
if(this.Valid)BirthMonth=this.ID18.substr(10,2);
if(BirthMonth.charAt(0)=='0')BirthMonth=BirthMonth.charAt(1);
return BirthMonth;
}
// 返回生日中的日,格式如下,10
clsIDCard.prototype.GetBirthDay = function() {
var BirthDay='';
if(this.Valid)BirthDay=this.ID18.substr(12,2);
return BirthDay;
}
// 返回性别,1:男,0:女
clsIDCard.prototype.GetSex = function() {
var Sex='';
if(this.Valid)Sex=this.ID18.charAt(16)%2;
return Sex;
}
// 返回15位身份证号码
clsIDCard.prototype.Get15 = function() {
var ID15='';
if(this.Valid)ID15=this.ID15;
return ID15;
}
// 返回18位身份证号码
clsIDCard.prototype.Get18 = function() {
var ID18='';
if(this.Valid)ID18=this.ID18;
return ID18;
}
// 返回所在省,例如:上海市、浙江省
clsIDCard.prototype.GetLocal = function() {
var Local='';
if(this.Valid)Local=this.Local;
return Local;
}
clsIDCard.prototype.GetVCode = function(CardNo17) {
var Wi = new Array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1);
var Ai = new Array('1','0','X','9','8','7','6','5','4','3','2');
var cardNoSum = 0;
for (var i=0; i<CardNo17.length; i++)cardNoSum+=CardNo17.charAt(i)*Wi[i];
var seq = cardNoSum%11;
return Ai[seq];
}
clsIDCard.prototype.CheckValid = function(CardNo18) {
if(this.GetVCode(CardNo18.substr(0,17))!=CardNo18.charAt(17))return false;
if(!this.IsDate(CardNo18.substr(6,8)))return false;
var aCity={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江 ",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北 ",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏 ",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"};
if(aCity[parseInt(CardNo18.substr(0,2))]==null)return false;
this.ID18=CardNo18;
this.ID15=CardNo18.substr(0,6)+CardNo18.substr(8,9);
this.Local=aCity[parseInt(CardNo18.substr(0,2))];
return true;
}
clsIDCard.prototype.IsDate = function(strDate) {
var r = strDate.match(/^(\d{1,4})(\d{1,2})(\d{1,2})$/);
if(r==null)return false;
var d= new Date(r[1], r[2]-1, r[3]);
return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[2]&&d.getDate()==r[3]);
}
function valiIdCard(idCard){
var checkFlag = new clsIDCard(idCard);
if (!checkFlag.IsValid()) {
alert("输入的身份证号无效,请输入真实的身份证号!");
document.getElementByIdx("idCard").focus();
return false;
}else{
alert("是有效身份证!");
}
}
</script>
https://www.cnblogs.com/yangmengsheng/p/5973586.html
阅读全文
C# 文件重命名、文件夹重命名方法,C#编程语言中没有 Rename 这样对文件或文件夹的重命名方法,但我们可以用文件或文件夹实体类的 Move 方法来操作。
Directory.Move(sourceDriName, destDriName);//文件夹
File.Move(sourceFileName, destFileName);//文件
https://jingyan.baidu.com/article/4b07be3cfc7ab348b280f311.html
阅读全文
using System.IO;
string path = @"D:\accountDaoRu\";
if (Directory.Exists(path) == false)
{
Directory.CreateDirectory(path);
}
if (Directory.Exists(Server.MapPath(~/upimg/hufu)) == false)//如果不存在就创建file文件夹{
Directory.CreateDirectory(Server.MapPath(~/upimg/hufu));}
//Directory.Delete(Server.MapPath(~/upimg/hufu), true);//删除文件夹以及文件夹中的子目录,文件
//判断文件的存在
if (File.Exists(Server.MapPath(~/upimg/Data.html))){
Response.Write(Yes);//存在文件}else{
Response.Write(No);
//不存在文件
File.Create(MapPath(~/upimg/Data.html));//创建该文件}
string name = GetFiles.FileName;//获取已上传文件的名字
string size = GetFiles.PostedFile.ContentLength.ToString();//获取已上传文件的大小
string type = GetFiles.PostedFile.ContentType;//获取已上传文件的MIME
string postfix = name.Substring(name.LastIndexOf(.) + 1);//获取已上传文件的后缀
string ipath = Server.MapPath(upimg) +\\+ name;//获取文件的实际路径
string fpath = Server.MapPath(upfile) + \\ + name;
string dpath = upimg\\ + name;//判断写入数据库的虚拟路径
ShowPic.Visible = true;//激活
ShowText.Visible = true;//激活
//判断文件格式
if (name == ) {
Response.Write(<scriptalert('上传文件不能为空')</script);}else{
if (postfix == jpg || postfix == gif || postfix == bmp || postfix == png){
GetFiles.SaveAs(ipath);
ShowPic.ImageUrl = dpath;
ShowText.Text = 你上传的图片名称是: + name + + 文件大小: + size + KB + + 文件类型: + type + + 存放的实际路径为: + ipath;}else{
ShowPic.Visible = false;//隐藏图片
GetFiles.SaveAs(fpath);//由于不是图片文件,因此转存在upfile这个文件夹
ShowText.Text = 你上传的文件名称是: + name + + 文件大小: + size + KB + + 文件类型: + type + + 存放的实际路径为: + fpath;}
https://www.cnblogs.com/yubufan/p/3863924.html
阅读全文
private void fx(Bitmap g)
{
for(int i=0;i<g.Width;i++)
for (int j = 0; j < g.Height; j++)
{
Color c = g.GetPixel(i, j);
Color cc=Color.FromArgb(255-c.R,255-c.G,255-c.B);
g.SetPixel(i,j,cc);
}
}
https://bbs.csdn.net/topics/240074740?list=30132
阅读全文
public static string GetNumberAlpha(string source)
{
string pattern = "[A-Za-z0-9]";
string strRet = "";
MatchCollection results = Regex.Matches(source, pattern);
foreach (var v in results)
{
strRet += v.ToString();
}
return strRet;
}
https://blog.csdn.net/qq_38693757/article/details/112984003
//只保留字母、数字 和汉字
string strAfter= Regex.Replace(strBefor, @"[^a-zA-Z0-9\u4e00-\u9fa5\s]", "");
正则表达式的前面一般都加@符号,@符号的作用是后面所跟字符串不进行转义,也就是后面跟的字符串是原封不动的
\s:匹配任何空白字符,相当于[ \f\n\r\t\v]
\S:匹配任何非空白字符,相当于[^\s]
//只保留字母、数字 和汉字、日文
string strAfter= Regex.Replace(strBefor, @"[^a-zA-Z0-9\u4e00-\u9fa5\u0800-\u4e00\s]", "");
阅读全文
一个 if 语句后可跟一个可选的 else if…else 语句,这可用于测试多种条件。
当使用 if…else if…else 语句时,以下几点需要注意:
一个 if 后可跟零个或一个 else,它必须在任何一个 else if 之后。
一个 if 后可跟零个或多个 else if,它们必须在 else 之前。
一旦某个 else if 匹配成功,其他的 else if 或 else 将不会被测试。
if(boolean_expression 1)
{
/* 当布尔表达式 1 为真时执行 */
}
else if( boolean_expression 2)
{
/* 当布尔表达式 2 为真时执行 */
}
else if( boolean_expression 3)
{
/* 当布尔表达式 3 为真时执行 */
}
else
{
/* 当上面条件都不为真时执行 */
}
阅读全文
找到个Asprise OCR,搞了半天才明白怎么装,装好了识别了一个M,然后今天想再研究一下,结果弹窗口了,多谢我的测试,要我访问他的官网
我真实无语了
只好又找到了一个tesseract-ocr,明天有空再研究研究
最近要做文字识别,不让直接用别人的接口,所以只能尝试去用开源的类库。tesseract-ocr是惠普公司开源的一个文字识别项目,通过它可以快速搭建图文识别系统,帮助我们开发出能识别图片的ocr系统。因为Windows环境开发,我也就必须在windows环境安装系统。
第一步:下载安装包并安装
https://github.com/tesseract-ocr/tesseract
下载好安装,和一般的程序差不多,一步一步点NEXT,但是有一个问题,网上有教程说直接可以在安装的时候选语言库,实际上呵呵,只能手工下载
可以翻墙下或者把链接弄到迅雷里面下,我下了中文的可以用迅雷下的
语言库地址为:https://github.com/tesseract-ocr/tessdata
将所需要的语言库下载下来,放在F:\Program Files (x86)\Tesseract-OCR\tessdata目录下
第二步,配置系统变量
桌面上此电脑->右键属性->点击高级系统设置->在打开的系统属性界面->高级下面点击环境变量->在环境变量界面选择系统变量中选中path,然后点下面的编辑,打开编辑环境变量界面新建一个C:\Program Files (x86)\Tesseract-OCR的值(这个路径就是安装路径,可以根据自己安装位置修改),然后确定
系统变量下面新建一个TESSDATA_PREFIX变量名,路径就是安装文件夹下面的tessdata文件夹的路径地址,复制过来即可
然后
运行CMD命令
输入:tesseract -v,可以看到版本信息
输入:tesseract –list-langs来查看本地Tesseract-OCR支持语言库
不行的话重启一次看看
第三步,测试
在cmd窗口中执行 tesseract test.jpg test.txt -l chi_sim+eng(chi_sim是中文识别包,equ是数学公式包,eng是英文包),即可将图片中的文字识别出来,但是效果貌似很差~可以自己训练字库,比较麻烦就懒得弄了,因为目前我就需要弄英文的
参考这些文章
https://www.cnblogs.com/wangkevin5626/p/9640165.html
https://www.cnblogs.com/jianqingwang/p/6978724.html
https://blog.csdn.net/sizhi_xht/article/details/104795600
阅读全文
我们使用Chrome代理上网时,一般都是打开Chrome设置-高级-代理设置-局域网设置-代理服务器。。。这样一设置的,全局都是代理了。如果只想chrome设置代理,就需要用下面的方法了。
Chrome使用独立全局代理。设置方法如下:
在桌面新建一个Chrome快捷方式,右键→属性→目标,如果是如果是: “C:\Program Files\chrome\chrome.exe” 则改为:“C:\Program Files\chrome\chrome.exe” /proxy-server=socks5://127.0.0.1:7070,就可以了,最好直接复制以免输错,如果手工输入,请注意”和/之间有半角空格
你打开这个快捷方式就是使用代理上网(注意:打开这个快捷方式之前必须关闭已经之前打开的Chrome)。如果你打开的是正常的Chrome桌面图标就是正常上网。
阅读全文
然后我认为是里面的保险烧了,于是就自己拆下来看了一下,大概看了一下线路,好像是有一个像是保险一样的东西,中间有个凸起来的东西,然后我把它按下去就通电了
然后还是经常跳,要经常去按那个类似保险的东西,今天我拆下来看了一下,背后还涂有像是硅胶一样的东西,像是电脑CPU上面涂的导热硅胶,抹干净硅胶后,上面有个88度C温度的字样,我感觉这个像是温控的东西,上网搜了一下,还真的是温控器,或者叫做热敏开关,有常开和常闭两种类型,然后我看了一下参数,型号是ksd302x,20安250伏,88度
上网看了一下说明,15安16安一般用在1800~2,000瓦的机子上,20安一般用在2500瓦到3000瓦的机子上,30安是用在6千瓦左右的机子上,于是我上淘宝买了两个,花了20块钱,拿回来试一下
还有一个要注意的,我现在拆下来这个原装的是4个接线针脚的,网上很多都是两个针脚的,所以要辨别一下,看清楚最好是热水器专用
还有就是有些是手动复位,有些是自动复位,也就是当温度太高的时候,它会自动跳出来,跳了以后手动复位要自己拆开机子去按一下,自动复位就不用手工去按,所以不用拆机子
阅读全文