读书人

图片判别

发布时间: 2012-11-23 00:03:43 作者: rapoo

图片识别
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

读书人网 >Web前端

热点推荐