图片识别_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 图片识别

图片识别

 2011/11/3 8:13:41  bjloveyb  http://bjloveyb.iteye.com  我要评论(0)
  • 摘要:packagecom.util;002003//~---JDKimports------------------------------------------------------------004005importcom.sun.image.codec.jpeg.JPEGCodec;006importcom.sun.image.codec.jpeg.JPEGEncodeParam;007importcom.sun.image.codec.jpeg.JPEGImageEncoder
  • 标签:图片
package com.util; 

002   

003 //~--- JDK imports ------------------------------------------------------------ 

004   

005 import com.sun.image.codec.jpeg.JPEGCodec; 

006 import com.sun.image.codec.jpeg.JPEGEncodeParam; 

007 import com.sun.image.codec.jpeg.JPEGImageEncoder; 

008   

009 import java.awt.*; 

010 import java.awt.image.*; 

011   

012 import java.io.*; 

013 import java.io.FileOutputStream; 

014 import java.io.OutputStream; 

015   

016 import java.net.*; 

017   

018 import javax.imageio.*; 

019 import javax.imageio.ImageIO; 

020   

021 /** *//** 

022  *   登陆验证图片转换为数字 

023  * 

024  * 

025  * @version    1.0, 08/04/20 

026  * @author     张健滢 

027  */

028 public class ImgIdent { 

029   

030     // 数字字符比特表 

031     private final long[][] NUMERIC = { 

032         { 512104545, 562436190 },    // ''0'' 

033         { 148931080, 136348222 },    // ''1'' 

034         { 511971394, 69273663 },     // ''2'' 

035         { 511971406, 17045598 },     // ''3'' 

036         { 35168914, 586948743 },     // ''4'' 

037         { 1065486398, 17045598 },    // ''5'' 

038         { 239208494, 830871646 },    // ''6'' 

039         { 1065623684, 69239824 },    // ''7'' 

040         { 512104542, 562436190 },    // ''8'' 

041         { 512104547, 486805660 } 

042     };                               // ''9'' 

043   

044     // 字框高 

045     private int intCharHeight = 10; 

046   

047     // 字框横向间隙 

048     private int intCharSpaceH = 5; 

049   

050     // 字框纵向间隙 

051     private int intCharSpaceY = 1; 

052   

053     // 字框宽 

054     private int           intCharWidth = 5; 

055     private int           IntImgHeight; 

056     private BufferedImage img; 

057     private int           intBgColor; 

058     private int           intCharColor; 

059     private int           intImgWith; 

060     private int           intMaxX; 

061     private int           intMaxY; 

062     private int           intMinX; 

063     private int           intMinY; 

064   

065     // 座标原点 

066     private Point  pOrigin; 

067     private String strNum; 

068   

069     /** *//** 

070      * Constructs  

071      * 

072      * 

073      * @param img 

074      * 

075      * @throws IOException 

076      */

077     public ImgIdent(BufferedImage img) throws IOException { 

078         this.img = img; 

079         init(); 

080     } 

081   

082     /** *//** 

083      *   构造函数 

084      *   @param   file     本地文件 

085      *   @throws   IOException 

086      */

087     public ImgIdent(File file) throws IOException { 

088         img = ImageIO.read(file); 

089         init(); 

090     } 

091   

092     /** *//** 

093      *   构造函数 

094      *   @param   url    远程文件 

095      *   @throws   IOException 

096      */

097     public ImgIdent(URL url) throws IOException { 

098         img = ImageIO.read(url); 

099         init(); 

100     } 

101   

102     /** *//** 

103      *   类初始工作 

104      */

105     private void init() { 

106   

107         // 得到图象的长度和宽度 

108         intImgWith   = img.getWidth(); 

109         IntImgHeight = img.getHeight(); 

110   

111         // 得到图象的背景颜色 

112         intBgColor = img.getRGB(7, 4); 

113   

114         // System.out.println(intBgColor); 

115   

116         // 初始化图象原点座标 

117         pOrigin = new Point(0, 0); 

118     } 

119   

120     /** *//** 

121      * Method description 

122      * 

123      */

124     private void getBaseInfo() { 

125         System.out.println(intBgColor + "|" + intCharColor); 

126         System.out.println(intMinX + "|" + intMinY + "|" + intMaxX + "|" + intMaxY); 

127     } 

128   

129     /** *//** 

130      *   得到字符的左上右下点座标 

131      *   @param   intNo   int                                   第n个字符 

132      *   @return   int[] 

133      */

134     private Point[] getCharRange(int intNo) { 

135   

136         // 左上右下点座标 

137         Point pTopLeft     = new Point(0, 0); 

138         Point pBottomRight = new Point(0, 0); 

139   

140         // 左上点 

141         pTopLeft.x = pOrigin.x + intCharWidth * (intNo - 1) + intCharSpaceH * (intNo - 1); 

142         pTopLeft.y = pOrigin.y; 

143   

144         // 右下点 

145         pBottomRight.x = 1 + pOrigin.x + intCharWidth * intNo + intCharSpaceH * (intNo - 1) - 1; 

146         pBottomRight.y = pOrigin.y + intCharHeight - 1; 

147   

148         return new Point[] { pTopLeft, pBottomRight }; 

149     } 

150   

151     /** *//** 

152      *   与背景颜色比较返回相应的字符 

153      *   @param   x   int                                           横座标 

154      *   @param   y   int                                           纵座标 

155      *   @return   char                                           返回字符 

156      */

157     private char getBit(int x, int y) { 

158         int intCurtColor; 

159   

160         intCurtColor = img.getRGB(x, y); 

161   

162         // System.out.println("[" + x + "," + y + "]" + intCurtColor + "==" + intBgColor + "==>" + (Math.abs(intCurtColor) >7308252)); 

163 //      return (Math.abs(intCurtColor) >= 5689325) 

164 //              ? ''0'' 

165 //              : ''1''; 

166         return (intCurtColor == intBgColor) 

167                ? ''0''

168                : ''1''; 

169   

170         // 5689325    6008535 

171     } 

172   

173     /** *//** 

174      *   得到第n个字符对应的字符串 

175      *   @param   intNo   int                                   第n个字符 

176      *   @return   String                                       代表字符位的串 

177      */

178     private String getCharString(int intNo) { 

179   

180         // 本字符的左上右下点座标 

181         Point[] p            = getCharRange(intNo); 

182         Point   pTopLeft     = p[0]; 

183         Point   pBottomRight = p[1]; 

184   

185         // 换算边界值 

186         int intX1, intY1, intX2, intY2; 

187   

188         intX1 = pTopLeft.x; 

189         intY1 = pTopLeft.y; 

190         intX2 = pBottomRight.x; 

191         intY2 = pBottomRight.y; 

192   

193 //      System.out.println("intX1=" + intX1); 

194 //      System.out.println("intY1=" + intY1); 

195 //      System.out.println("intX2=" + intX2); 

196 //      System.out.println("intY2=" + intY2); 

197   

198         // 在边界内循环取象素 

199         int    i, j; 

200         String strChar = ""; 

201   

202         for (i = intY1; i <= intY2; i++) { 

203             for (j = intX1; j <= intX2; j++) { 

204                 System.out.print(getBit(j, i)); 

205                 strChar = strChar + getBit(j, i); 

206             } 

207   

208             System.out.println(); 

209         } 

210   

211         System.out.println(); 

212   

213         return strChar; 

214     } 

215   

216     /** *//** 

217      *   得到第n个字符对应数值 

218      *   @param   intNo   int                                   第n个字符 

219      *   @return   int                                             对应数值 

220      */

221     public int getNum(int intNo) { 

222   

223         // 取得位字符串 

224         String strChar = getCharString(intNo); 

225   

226         // System.out.println(intNo+"=="+strChar); 

227         // 取得串高位串和低位串 

228         String strCharHigh = strChar.substring(0, strChar.length() / 2); 

229         String strCharLow  = strChar.substring(strChar.length() / 2); 

230   

231         // 计算高位和低位值 

232         long lCharHigh = Long.parseLong(strCharHigh, 2); 

233   

234         System.out.println(lCharHigh); 

235   

236         long lCharLow = Long.parseLong(strCharLow, 2); 

237   

238         System.out.println(lCharLow); 

239   

240         // 在数字中循环比较 

241         int intNum = ''*''; 

242   

243         for (int i = 0; i <= 9; i++) { 

244             if ((lCharHigh == NUMERIC[i][0]) && (lCharLow == NUMERIC[i][1])) { 

245                 intNum = i; 

246   

247                 break

248             } else { 

249                 if ((lCharHigh == 834533329) && (lCharLow == 242870177)) { 

250                     intNum = 6; 

251                 }    // 834533329 242870177 

252                         else { 

253                     intNum = 1; 

254                 }    // 默认为1   低位为    937393609  937393601 

255             } 

256         } 

257   

258         return intNum; 

259     } 

260   

261     /** *//** 

262      * 保存图片 

263      * 

264      * 

265      * @param length 

266      * 

267      * @return 

268      */

269     public String getValidatecode(int length) { 

270         String strNum = ""; 

271   

272         for (int i = 1; i <= length; i++) { 

273             synchronized (this) { 

274                 strNum += String.valueOf(getNum(i)); 

275             } 

276         } 

277   

278         return strNum; 

279     } 

280   

281     /** *//** 

282      * Method description 

283      * 

284      * 

285      * @param iag 

286      * @param savePath 

287      * 

288      * @throws FileNotFoundException 

289      * @throws IOException 

290      */

291     public void saveJPEG(BufferedImage iag, String savePath) throws FileNotFoundException, IOException { 

292         OutputStream     jos     = new FileOutputStream(savePath); 

293         JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(jos); 

294         JPEGEncodeParam  jpegEP  = JPEGCodec.getDefaultJPEGEncodeParam(iag); 

295   

296         jpegEP.setQuality((float) 1, true); 

297         encoder.encode(iag, jpegEP); 

298         jos.flush(); 

299         jos.close(); 

300     } 

301 } 

302   

303    

304   

305 恩这样数字是可以识别出来了,可以我要怎么完成提交那块的工作呢?好在Apache已经为我做完了。我用了 

306 HttpClient这样一个模拟Http协议的小工具包。我只要往那个 Add_MSG.asp里面提交就完了。 

307   

308   

309   

310 package com.util; 

311   

312 //~--- non-JDK imports -------------------------------------------------------- 

313   

314 import org.apache.commons.httpclient.*; 

315 import org.apache.commons.httpclient.methods.GetMethod; 

316 import org.apache.commons.httpclient.methods.PostMethod; 

317 import org.apache.commons.httpclient.params.HttpClientParams; 

318 import org.apache.commons.httpclient.params.HttpMethodParams; 

319   

320 //~--- JDK imports ------------------------------------------------------------ 

321   

322 import java.awt.image.BufferedImage; 

323   

324 import java.io.InputStream; 

325   

326 import javax.imageio.ImageIO; 

327   

328   

329 public class MyHttpClient { 

330   

331     /** *//** 

332      * Method description 

333      * 

334      * 

335      * @param title 留言标题 

336      * @param name 留言者 

337      * @param Content 内容 

338      * @param proIP 代理IP 

339      * @param port  代理端口 

340      * @param usePro 是否使用代理 

341      */

342     public synchronized void doSomeThing(String title, String name, String Content, String proIP, int port, 

343             boolean usePro) { 

344   

345         // 构造HttpClient的实例 

346         HttpClient       httpClient   = new HttpClient(); 

347         HttpClientParams clientParams = new HttpClientParams(); 

348   

349         // 隐藏自己请求相关的信息 

350         clientParams.setParameter("http.useragent", "Mozilla/4.0 (compatible; FIREFOX 9.0; IBM AIX 5)"); 

351   

352         // httpClient.getHttpConnectionManager().getParams().setSoTimeout(30 * 1000); 

353         clientParams.setHttpElementCharset("GBK"); 

354   

355         HttpState httpState = new HttpState(); 

356   

357         httpClient.setParams(clientParams); 

358         httpClient.getParams(), .setParameter(HttpClientParams.HTTP_CONTENT_CHARSET, "GBK"); 

359         httpClient.setState(httpState); 

360         clientParams.setVersion(HttpVersion.HTTP_1_1); 

361   

362         // httpClient.getHostConfiguration().setProxy("148.233.159.58", 3128); 

363   

364         if (usePro)    // 使用代理 

365         { 

366             httpClient.getHostConfiguration().setProxy(proIP, port); 

367         } 

368   

369         // 创建GET方法的实例 

370         GetMethod getMethod = new GetMethod("http://www.XXXcom/Guestbook/imgchk/validatecode.asp"); 

371   

372         // 使用系统提供的默认的恢复策略 

373         getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler()); 

374   

375         try { 

376   

377             // 执行getMethod 

378             int statusCode = httpClient.executeMethod(getMethod); 

379   

380             // System.out.println(statusCode); 

381             if (statusCode != HttpStatus.SC_OK) { 

382                 System.err.println("Method failed: " + getMethod.getStatusLine()); 

383             }    // 读取内容 

384   

385             InputStream inStream = getMethod.getResponseBodyAsStream(); 

386   

387             // 处理内容 

388             // System.out.println(new String(responseBody)); 

389             BufferedImage iag      = ImageIO.read(inStream); 

390             ImgIdent      imgIdent = new ImgIdent(iag); 

391   

392             // imgIdent.saveJPEG(iag, "C:/ddd.jpg"); 

393             String validate = imgIdent.getValidatecode(4); 

394   

395             System.out.println(validate); 

396   

397             PostMethod method  = new PostMethod("http://www.XXX.com/Guestbook/add_msg.asp"); 

398             String     connect = Content; 

399             String     Title   = title; 

400   

401             method.setParameter("subject", Title); 

402             method.setParameter("g_name", name); 

403             method.setParameter("companyname", ""); 

404             method.setParameter("mail", ""); 

405             method.setParameter("homepageurl", "http://"); 

406             method.setParameter("pic", "p5.gif"); 

407             method.setParameter("validatecode", validate); 

408             method.setParameter("content", connect); 

409   

410 //          if (todo) { 

411             int code = httpClient.executeMethod(method); 

412   

413             // String Stringresponse = new String(method.getResponseBodyAsString().getBytes("8859_1")); 

414             // 打印返回的信息 

415             // System.out.println(Stringresponse); 

416 //          } 

417   

418             method.releaseConnection(); 

419   

420 //          System.out.println(iag.getHeight()); 

421 //          System.out.println(iag.getWidth()); 

422 //          //背景 颜色 

423 //          intBgColor = iag.getRGB(38, 0); 

424 //          System.out.println("intBgColor=" + intBgColor); 

425 // 

426 // 

427 //          intBgColor = iag.getRGB(0, 0); 

428 //          System.out.println("intBgColor=" + intBgColor); 

429         } catch (Exception e) { 

430   

431             // 发生网络异常 

432             e.printStackTrace(); 

433         } finally {} 

434   

435         // 释放连接   getMethod.releaseConnection();  } 

436         getMethod.releaseConnection(); 

437     } 

438 }


文章出处:飞诺网(www.diybl.com):http://www.diybl.com/course/3_program/java/javashl/2008426/111563.html
发表评论
用户名: 匿名