请问这里哪里错了?为什么出现这个:Exception inpython3 threadd "main"3

&转&Exception in thread &main& java.lang.NoClassDefFoundError或者原因
&来源:读书人网&【读书人网():综合教育门户网站】
转Exception in thread main java.lang.NoClassDefFoundError可能原因  一,类路径(classpath)当你满怀
&转&Exception in thread &main& java.lang.NoClassDefFoundError可能原因
  一,类路径(classpath)当你满怀着希望安装好了java,然后兴冲冲地写了个helloworld,然后编译,运行,就等着那两个美好的单词出现在眼前,可是不幸的是,只看到了Can'tfindclassHelloWorld或者Exceptioninthread"main"java.lang.NoSuchMethodError:maain.  为什么呢?编译好的class明明在呀.  我们一起来看一看java程序的运行过程.我们已经知道java是通过java虚拟机来解释运行的,也就是通过java命令,javac编译生成的.class文件就是虚拟机要执行的代码,称之为字节码(bytecode),虚拟机通过classloader来装载这些字节码,也就是通常意义上的类.这里就有一个问题,classloader从哪里知道java本身的类库及用户自己的类在什么地方呢?或者有着缺省值(当前路径).  或者要有一个用户指定的变量来表明,这个变量就是类路径(classpath),或者在运行的时候传参数给虚拟机.这也就是指明classpath的三个方法.编译的过程和运行的过程大同小异,只是一个是找出来编译,另一个是找出来装载.  实际上java虚拟机是由javaluncher初始化的,也就是java(或java.exe)这个程序来做的.虚拟机按以下顺序搜索并装载所有需要的类:  1,引导类:组成java平台的类,包含rt.jar和i18n.jar中的类.  2,扩展类:使用java扩展机制的类,都是位于扩展目录($JAVA_HOME/jre/lib/ext)中的.jar档案包.  3,用户类:开发者定义的类或者没有使用java扩展机制的第三方产品.你必须在命令行中使用-classpath选项或者使用CLASSPATH环境变量来确定这些类的位置.我们在上面所说的用户自己的类就是特指这些类.  这样,一般来说,用户只需指定用户类的位置,引导类和扩展类是"自动"寻找的.  那么到底该怎么做呢?用户类路径就是一些包含类文件的目录,.jar,.zip文件的列表,至于类具体怎么找,因为牵扯到package的问题,下面将会说到,暂时可认为只要包含了这个类就算找到了这个类.根据平台的不同分隔符略有不同,类unix的系统基本上都是":",windows多是";".其可能的来源是:  *".",即当前目录,这个是缺省值.  *CLASSPATH环境变量,一旦设置,将缺省值覆盖.  *命令行参数-cp或者-classpath,一旦指定,将上两者覆盖.  *由-jar参数指定的.jar档案包,就把所有其他的值覆盖,所有的类都来自这个指定的档案包中.由于生成可执行的.jar文件,还需要其他一些知识,比如package,还有特定的配置文件,本文的最后会提到.可先看看jdk自带的一些例子.  我们举个HelloWorld的例子来说明.先做以下假设:  *当前目录是/HelloWorld(或c:\HelloWorld,以后都使用前一个)*jdk版本为1.2.2(linux下的)*PATH环境变量设置正确.(这样可以在任何目录下都可以使用工具)*文件是HelloWorld.java,内容是:  publicclassHelloWorld{publicstaticvoidmain(String[]args){System.out.println("HelloWorld!\n");System.exit(0);}  }  首先这个文件一定要写对,如果对c熟悉的话,很有可能写成这样:  publicstaticvoidmain(intargc,String[]argv){....  }  这样是不对的,不信可以试一试.由于手头没有java的规范,所以作如下猜想:java的application程序,必须以publicstaticvoidmain(String[])开始,其他不一样的都不行.  到现在为止,我们设置方面只设置了PATH.  1,当前路径就是指你的.class文件在当前目录下,[HelloWorld]$javacHelloWorld.java//这一步不会有多大问题,[HelloWorld]$javaHelloWorld//这一步可能就会有问题.  如果出了象开头那样的问题,首先确定不是由于敲错命令而出错.如果没有敲错命令,那么接着做:  [HelloWorld]$echo$CLASSPATH或者c:\HelloWorld&echo%CLASSPATH%看看CLASSPATH环境变量是否设置了,如果设置了,那么用以下命令:  [HelloWorld]$CLASSPATH=或者c:\HelloWorld&setCLASSPATH=来使它为空,然后重新运行.这次用户类路径缺省的是".",所以应该不会有相同的问题了.还有一个方法就是把"."加入到CLASSPATH中.  [/]$CLASSPATH=$CLASSPATH:.  或者c:\HelloWorld&setCLASSPATH=%CLASSPATH%;.  同样也可以成功.GoodLuck.  2,当你的程序需要第三方的类库支持,而且比较常用,就可以采用此种方法.比如常用的驱动程序,写servlet需要的servlet包等等.设置方法就是在环境变量中加入CLASSPATH.然后就可以直接编译运行了.还是以HelloWorld为例,比如你想在根目录中运行它,那么你直接在根目录下执行$javaHelloWorld或者c:\&javaHelloWorld这样肯定会出错,如果你的CLASSPATH没有改动的话.我想大家应该知道为什么错了吧,那么怎么改呢?前面说过,用户类路径就是一些包含你所需要的类的目录,.jar档案包,.zip包.现在没有生成包,所以只好把HelloWorld.class所在的目录加到CLASSPAT了,根据前面的做法,再运行一次,看看,呵呵,成功了,换个路径,又成功了!!不仅仅?br/&以直接运行其中的类,当你要import其中的某些类时,同样处理.  不知道你想到没有,随着你的系统的不断的扩充,(当然了,都是一些需要java的东挝?  如果都加到这个环境变量里,那这个变量会越来越臃肿,虽然环境变量空间可以开很大,总觉得有些不舒服.看看下面一个方法.  3,在命令行参数中指明classpath.  还是和上同的目标,在任何目录下执行HelloWorld,用这个方法怎么实现呢?  [/]$java-cp/HelloWorldHelloWorld或者c:\&java-cpc:\HelloWorldHelloWorld就可以了.这是这种方法的最简单的应用了.当你使用了另外的包的时候,还可以采用用?br/&种方法.例如:  $javac-classpathaPath/aPackage.jar:.myJava.java$java-cpaPath/aPackage.jar:.myJava或者c:\&javac-classpathaPath\aPackage..myJava.javac:\&java-cpaPath\aPackage..myJava这种方法也有一个不方便的的地方就是当第三方包所在的路径较长或者需要两个以上包包?br/&时候,每次编译运行都要写很长,非常不方便,这时候可以写脚本来解决.比如一个例子:  compile(文件,权限改为可执行,当前目录)$catcompile---------------------------#!/bin/bashjavac-classpathaPath\aPackage.jar:anotherPath\anotherPackage.jar:.myJavva.java---------------------------run(文件,权限改为可执行,当前目录)$catrun---------------------------#!/bin/bashjava-cpaPath\aPackage.jar:anotherPath\anotherPackage.jar:.myJava---------------------------或者:  compile.batc:\HelloWorld&typecompile.bat-------------------------javac-classpathaPath\aPackage.jar:anotherPath\anotherPackage.jar:.myJavva.java-------------------------run.batc:\HelloWorld&typerun.bat------------------------java-cpaPath\aPackage.jar:anotherPath\anotherPackage.jar:.myJava------------------------就可以了.试试看.  前面提到了扩展类,扩展类是什么呢?java的扩展类就是应用程序开发者用来扩展核心平台功能的java类的包(或者是nativecode).虚拟机能像使用系统类一样使用这些扩展类.有人建议可以把包放入扩展目录里,这样,CLASSPATH也不用设了,也不用指定了,岂不是很方便?确实可以正确运行,但是个人认为这样不好,不能什么东西都往里搁,一些标准的扩展包可以,比如,JavaServlet,Java3D等等.可以提个建议,加一个环境变量,比如叫JARPATH,指定一个目录,专门存放用户的jarzip等包,这个要等SUN公司来做了.  windows98下,我原来安装的时候,一直装不上,总是死机,好不容易装上了,缺省的是不能运行正确的,然后把tool.jar放入CLASSPATH后工作正常.现在作测试,去掉仍然是正确的.经过多次测试,发现如果原来曾装过jdk的都很好,没有装过的装的时候会死机,多装几次就可以了.如果你发现正确安装后,不能正常工作,就把tools.jar加入CLASSPATH,试一下.  二,包(package)Java中的"包"是一个比较重要的概念,package是这样定义的:  Definition:Apackageisacollectionofrelatedclassesandinterfacesthatprovidesaccessprotectionandnamespacemanagement.  也就是:一个包就是一些提供访问保护和命名空间管理的相关类与接口的集合.  使用包的目的就是使类容易查找使用,防止命名冲突,以及控制访问.  这里我们不讨论关于包的过多的东西,只讨论和编译,运行,类路径相关的东西.  至于包的其他内容,请自己查阅相关文档.  简单一点来说,包就是一个目录,下面的子包就是子目录,这个包里的类就是这个目录下的文件.我们用一个例子来说明.  首先建目录结构如下:PackageTest/source/,以后根目录指的是PackageTest目录,我们的源程序放在source目录下.源程序如下:  PackageTest.importpktest.subpk.*;publicclassPackageTest{privateSpublicPackageTest(Strings){value=s;}  publicvoidprintValue(){System.out.println("ValueofPackageTestis"+value);}  publicstaticvoidmain(String[]args){PackageTesttest=newPackageTest("ThisisaTestPackage");test.printValue();PackageSecondsecond=newPackageSecond("IaminPackageTest");second.printValue();PackageSubsub=newPackageSub("IaminPackageTest");sub.printValue();System.exit(0);}  }  PackageSecond.publicclassPackageSecond{privateSpublicPackageSecond(Strings){value=s;}  publicvoidprintValue(){System.out.println("ValueofPackageSecondis"+value);}  }  PackageSub.javapackagepktest.importpktest.*;publicclassPackageSub{privateSpublicPackageSub(Strings){value=s;}  publicvoidprintValue(){PackageSecondsecond=newPackageSecond("Iaminsubpackage.");second.printValue();System.out.println("ValueofPackageSubis"+value);}  }  Main.javaimportpktest.*;importpktest.subpk.*;publicclassMain(){publicstaticvoidmain(){PackageSecondsecond=newPackageSecond("IaminMain");second.printValue();PackageSubsub=newPackageSub("IaminMain");sub.printValue();System.exit(0);}  }  其中,Main.java是包之外的一个程序,用来测试包外的程序访问包内的类,PackageTest.java属于pktest这个包,也是主程序.PackageSecond.java也属于pktest,PackageSub属于pktest下的subpk包,也就是pktest.subpk.  详细使用情况,请参看源程序.  好了,先把源程序都放在source目录下,使source成为当前目录,然后编译一下,呵呵,出错了,Main.java:1:Packagepktestnotfoundinimport.  importpktest.*;这里涉及到类路径中包是怎么查找的,前面我们做了一点假设:"只要包含了这个类就算找到了这个类",现在就有问题了.其实jdk的工具javacjavajavadoc都需要查找类,看见目录,就认为是包的名字,对于import语句来说,一个包对应一个目录.这个例子中,importpktest.*,我们知道类路径可以包含一个目录,那么就以那个目录为根,比如有个目录/myclass,那么就会在查找/myclass/pktest目录及其下的类.所有的都找遍,如果没有就会报错.由于现在的类路径只有当前目录,而当前目录下没有pktest目录,所以就会出错.类路径还可以包含.jar.zip文件,这些就是可以带目录的压缩包,可以把.jar.zip文件看做一个虚拟的目录,然后就和目录一样对待了.  好了,应该知道怎么做了吧,修改后的目录结构如下:  PackageTest||__sourceMain.java||__pktestPackageTest.javaPackageSecond.java||__subpkPackageSub.java然后重新编译,运行,哈哈,通过了.我们再来运行一下PackageTest.  [source]$javapktest/PackageTest怎么又出错了?  Exceptioninthread"main"java.lang.NoClassDefFoundError:pktest/PackageTest是这样的,java所要运行的是一个类的名字,它可不管你的类在什么地方,就象我们前面所讨论的一样来查找这个类,所以它把pktest/PackageTest看成是一个类的名字了,当然会出错了,应该这么做,[source]$javapktest.PackageTest大家应该明白道理吧,我就不多说了.注意javac不一样,是可以指明源文件路径的,javac只编译,不运行,查找类也只有在源文件中碰到import时才会做,与源文件所在的包没有关系.  似乎还又些不好的地方,怎么生成的.class文件这么分散呀,看着真别扭.别急,javac有一个-d命令行参数,可以指定一个目录,把生成的.class文件按照包给你好好地搁在这个目录里面.  [source]$mkdirclasses[source]$javac-dclassespktest/PackageTest.java[source]$javac-dclassesMain.java那么运行怎么运行呢?  [source]$cdclasses[classes]$javapktest.PackageTest[classes]$javaMain就可以了.其实jdk的这一套工具小巧简单,功能强大,不会用或者用错其实不关工具的事,关键是明白工具背后的一些原理和必要的知识.集成环境是很好,但是它屏蔽了很多底层的知识,不出错还好,一旦出错,如果没有这些必要的知识就很难办,只好上bbs问,别人只告诉了你解决的具体方法,下一次遇到稍微变化一点的问题又不懂了.所以不要拘泥于工具,java的这一套工具组合起来使用,中小型工程(五六十个类),还是应付得下来的.  三,jar文件以下把.jar.zip都看做是.jar文件.  1,从前面我们可以看出来jar文件在java中非常重要,极大地方便了用户的使用.我们也可以做自己的.jar包.  还是使用前面那个例子,Main.java是包之外的东西,用了pktest包中的类,我们现在就是要把pktest做成一个.jar包,很简单,刚才我们已经把pktest中的.class都集中起来了,[classes]$jar-cvfmypackage.jarpktest就会生成mypackage.jar文件,测试一下,刚才我们生成的Main.class就在classes目录下,所以,从前面可以知道:  [classes]$java-cpmypackage.jar:.Main就可以运行了.  2,如果你看过jdk所带的例子,你就会知道,.jar还可以直接运行,[/demo]$java-jaraJar.jar那好,就那我们的试一试,[classes]$java-jarmypackage.jarFailedtoloadMain-Classmanifestattributefrommypackage.jar看来我们的jar和它的jar还不一样,有什么不一样呢?拿它一个例子出来,重新编译,生成.jar文件,比较后发现,是.jar压缩包中META-INF/MANIFEST.MF文件不一样,多了一行,Main-Class:xxxxx,再看看出错信息,原来是没有指定Main-Class,看看jar命令,发现有一个参数-m,-mincludemanifestinformationfromspecifiedmanifestfile和出错信息有点关系,看来它要读一个配制文件.只好照猫画虎写一个了.  [classes]$catmyManifestManifest-Version:1.0Main-Class:pktest.PackageTestCreated-By:1.2.2(SunMicrosystemsInc.)[classes]$jarcvfmmypackage.jarmyManifestpktestaddedmanifestadding:pktest/(in=0)(out=0)(stored0%)adding:pktest/PackageSecond.class(in=659)(out=395)(deflated40%)adding:pktest/subpk/(in=0)(out=0)(stored0%)adding:pktest/subpk/PackageSub.class(in=744)(out=454)(deflated38%)adding:pktest/PackageTest.class(in=1041)(out=602)(deflated42%)[classes]$java-jarmypackage.jarValueofPackageTestisThisisaTestPackageValueofPackageSecondisIaminPackageTestValueofPackageSecondisIaminsubpackage.  ValueofPackageSubisIaminPackageTest好了,成功了,这样就做好了一个可以直接执行的.jar文件.大家可以自己试一试做一个以Main为主程序的可执行的jar.  小结:  这篇文章中,我们讨论了java中的classpath,package,jar等基本但比较重要的东西,主要是classpath.并不是简单的一份CLASSPATH的完全功略,而是试图让读者明白其原理,自己思考,自己动手.其实大多数东西都在sun的javadoc中都有,我只不过结合例子稍微谈了一下,希望能有所帮助.由于条件所限,只测试了jdk1.2.2在98及linux的情况,其他版本的jdk和平台请大家自己测试,错误在所难免,还请指正.  下面是一些需要注意的问题:  1,如果类路径中需要用到.jar文件,必须把jar文件的文件名放入类路径,而不是其所在的目录.  2,在任何时候,类名必须带有完全的包名,3,"."当前目录最好在你的类路径中.  下面是一些常见的编译和运行的模式.  4.TocompileHelloWorld.javaappinthedefaultpackageinC:\MyDir,useCD\MyDirC:\jdk1.3\bin\Javac.exe-classpath.HelloWorld.java5.TorunaHelloWorld.classapp,inthedefaultpackageinC:\MyDir,useCD\MyDirC:\jdk1.3\bin\Java.exe-classpath.HelloWorld6.TorunaHelloWorld.classapp,inthedefaultpackageinajarinC:\MyDir,uuseCD\MyDirC:\jdk1.3\bin\Java.exe-classpathHelloWorld.jarHelloWorld7.TocompileaHelloWorld.javaappinC:\MyPackage,inpackageMyPackage,useCD\C:\jdk1.3\bin\Javac.exe-classpath.MyPackage\HelloWorld.java8.TorunaHelloWorld.classappinC:\MyPackage,inpackageMyPackage,useCD\C:\jdk1.3\bin\Java.exe-classpath.MyPackage.HelloWorld9.TorunaHelloWorld.classappinC:\MyPackage,inajarinpackageMyPackage,,useCD\MyDirC:\jdk1.3\bin\Java.exe-classpathHelloWorld.jarMyPackage.HelloWorl(注:defaultpackage指的是在程序中不指定任何包).  最后一个小小的建议,把sun的jdktoolsdocumentation好好地看一看,把jdk的那些工具javajavacjavadocjarjavapjdb......好好用一用,会有好处的.TheSimplestIsTheBest.  参考文献:  JavaToolsDocumentation.  JavaGlossary/?温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
阅读(986)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_094071',
blogTitle:'Exception in thread &main& java.lang.ClassCastException: java.util.ArrayList',
blogAbstract:'在使用Hibernate存一个Collection时出现了这个异常,当时在Mapping文件里配的是&set/&标签,后来改成&bag/&就通过了:ExceptionStackTrace如下:Exception in thread \"main\" java.lang.ClassCastException: java.util.ArrayList&&& at org.hibernate.type.SetType.wrap(SetType.java:39)&&& at org.hibernate.event.def.WrapVisitor.processArrayOrNewCollection(WrapVisitor.java:84)&&',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:8,
publishTime:8,
permalink:'blog/static/',
commentCount:1,
mainCommentCount:1,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'SCJP *\r\nSCWCD\r\nSCBCD\r\nSCEA',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}& java验证码识别–1
java验证码识别–1
(本文仅用于学习研究图像匹配识别原理,不得用于其他用途。)
完整eclipse工程
最近看了看验证码的识别,先从最简单的做起吧(固定大小,固定位置,固定字体)
验证码识别基本分四步,图片预处理,分割,训练,识别
看一个最简单验证码
这是一个德克萨斯扑克的注册页面的验证码
1。图像的预处理
这种直接根据亮度设个阈值处理就可以了
public static int isWhite(int colorInt) {
Color color = new Color(colorInt);
if (color.getRed() + color.getGreen() + color.getBlue() & 100) {
public static BufferedImage removeBackgroud(String picFile)
throws Exception {
BufferedImage img = ImageIO.read(new File(picFile));
int width = img.getWidth();
int height = img.getHeight();
for (int x = 0; x & ++x) {
for (int y = 0; y & ++y) {
if (isWhite(img.getRGB(x, y)) == 1) {
img.setRGB(x, y, Color.WHITE.getRGB());
img.setRGB(x, y, Color.BLACK.getRGB());
处理完图片效果为
图像基本分得比较清楚,图片分割也比较容易
这个验证码居然是固定位置的,分割相当简单,直接截取相应位置就可以了
public static List&BufferedImage& splitImage(BufferedImage img)
throws Exception {
List&BufferedImage& subImgs = new ArrayList&BufferedImage&();
subImgs.add(img.getSubimage(10, 6, 8, 10));
subImgs.add(img.getSubimage(19, 6, 8, 10));
subImgs.add(img.getSubimage(28, 6, 8, 10));
subImgs.add(img.getSubimage(37, 6, 8, 10));
return subI
直接拿几张图片,包含0-9,每个数字一个样本就可以了,将文件名对应相应的数字
因为是固定大小,固定位置,识别也很简单。
直接拿分割的图片跟这个十个图片一个像素一个像素的比,相同的点最多的就是结果。比如如果跟5.jpg最相似,那么识别的结果就是5。
下面是识别结果,很容易达到100%
完整代码(csdn连个附件都不支持):
import java.awt.C
import java.awt.image.BufferedI
import java.io.F
import java.io.FileOutputS
import java.io.InputS
import java.io.OutputS
import java.util.ArrayL
import java.util.HashM
import java.util.L
import java.util.M
import javax.imageio.ImageIO;
import mons.httpclient.HttpC
import mons.httpclient.HttpS
import mons.httpclient.methods.GetM
import mons.io.IOU
public class ImagePreProcess {
public static int isWhite(int colorInt) {
Color color = new Color(colorInt);
if (color.getRed() + color.getGreen() + color.getBlue() & 100) {
public static int isBlack(int colorInt) {
Color color = new Color(colorInt);
if (color.getRed() + color.getGreen() + color.getBlue() &= 100) {
public static BufferedImage removeBackgroud(String picFile)
throws Exception {
BufferedImage img = ImageIO.read(new File(picFile));
int width = img.getWidth();
int height = img.getHeight();
for (int x = 0; x & ++x) {
for (int y = 0; y & ++y) {
if (isWhite(img.getRGB(x, y)) == 1) {
img.setRGB(x, y, Color.WHITE.getRGB());
img.setRGB(x, y, Color.BLACK.getRGB());
public static List&BufferedImage& splitImage(BufferedImage img)
throws Exception {
List&BufferedImage& subImgs = new ArrayList&BufferedImage&();
subImgs.add(img.getSubimage(10, 6, 8, 10));
subImgs.add(img.getSubimage(19, 6, 8, 10));
subImgs.add(img.getSubimage(28, 6, 8, 10));
subImgs.add(img.getSubimage(37, 6, 8, 10));
return subI
public static Map&BufferedImage, String& loadTrainData() throws Exception {
Map&BufferedImage, String& map = new HashMap&BufferedImage, String&();
File dir = new File(&train&);
File[] files = dir.listFiles();
for (File file : files) {
map.put(ImageIO.read(file), file.getName().charAt(0) + &&);
public static String getSingleCharOcr(BufferedImage img,
Map&BufferedImage, String& map) {
String result = &&;
int width = img.getWidth();
int height = img.getHeight();
int min = width *
for (BufferedImage bi : map.keySet()) {
int count = 0;
Label1: for (int x = 0; x & ++x) {
for (int y = 0; y & ++y) {
if (isWhite(img.getRGB(x, y)) != isWhite(bi.getRGB(x, y))) {
if (count &= min)
break Label1;
if (count & min) {
result = map.get(bi);
public static String getAllOcr(String file) throws Exception {
BufferedImage img = removeBackgroud(file);
List&BufferedImage& listImg = splitImage(img);
Map&BufferedImage, String& map = loadTrainData();
String result = &&;
for (BufferedImage bi : listImg) {
result += getSingleCharOcr(bi, map);
ImageIO.write(img, &JPG&, new File(&result//&+result+&.jpg&));
public static void downloadImage() {
HttpClient httpClient = new HttpClient();
GetMethod getMethod = new GetMethod(
&/authimg.php&);
for (int i = 0; i & 30; i++) {
// 执行getMethod
int statusCode = httpClient.executeMethod(getMethod);
if (statusCode != HttpStatus.SC_OK) {
System.err.println(&Method failed: &
+ getMethod.getStatusLine());
// 读取内容
String picName = &img//& + i + &.jpg&;
InputStream inputStream = getMethod.getResponseBodyAsStream();
OutputStream outStream = new FileOutputStream(picName);
IOUtils.copy(inputStream, outStream);
outStream.close();
System.out.println(&OK!&);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放连接
getMethod.releaseConnection();
* @param args
* @throws Exception
public static void main(String[] args) throws Exception {
for (int i = 0; i & 30; ++i) {
String text = getAllOcr(&img//& + i + &.jpg&);
System.out.println(i + &.jpg = & + text);
本文的评论功能被关闭了.

我要回帖

更多关于 ueditor quot 的文章

 

随机推荐