java 拖动验证码实现_java实现拖动图片验证码
思路是,对原图产生两张图片,一张是底图,被抠掉一部分的图片,另外一张是移动图,被抠出的来部分
只写了后台怎么生成拖动验证码的两个图片,前端的还没写,待续。以下是后台的代码
class="java">
/*
* 根据源图片,剪切出两张图
* */
package com.chainway.dragimgvalidate;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
public class ImageUtil {
public static void cut(int x,int y,int width,int height,String srcpath,String subpath) throws IOException {//裁剪方法
FileInputStream is=null;
ImageInputStream iis=null;
try{
is=new FileInputStream(srcpath); //读取原始图片
Iteratorit=ImageIO.getImageReadersByFormatName("jpg"); //ImageReader声称能够解码指定格式
ImageReader reader=it.next();
iis=ImageIO.createImageInputStream(is); //获取图片流
reader.setInput(iis, true); //将iis标记为true(只向前搜索)意味着包含在输入源中的图像将只按顺序读取
ImageReadParam param=reader.getDefaultReadParam(); //指定如何在输入时从 Java Image I/O框架的上下文中的流转换一幅图像或一组图像
Rectangle rect=new Rectangle(x, y, width, height); //定义空间中的一个区域
param.setSourceRegion(rect); //提供一个 BufferedImage,将其用作解码像素数据的目标。
BufferedImage bi=reader.read(0, param); //读取索引imageIndex指定的对象
ImageIO.write(bi, "jpg", new File(subpath)); //保存新图片
}finally{
if(is!= null)
is.close();
if(iis != null)
iis.close();
}
}
private void cutByTemplate2(BufferedImage oriImage,BufferedImage newSrc,BufferedImage newSrc2,int x,int y,int width,int height){
//固定圆半径为5
int c_r=20;
double rr=Math.pow(c_r, 2);//r平方
//圆心的位置
Random rand=new Random();
int c_a=rand.nextInt(width-2*c_r)+(x+c_r);//x+c_r+10;//圆心x坐标必须在(x+r,x+with-r)范围内
//System.out.println(c_a);
int c_b=y;
//第二个圆(排除圆内的点)
Random rand2=new Random();
int c2_a=x;
int c2_b=rand2.nextInt(height-2*c_r)+(y+c_r);//y+c_r+50;//圆心y坐标必须在(y+r,y+height-r)范围内
//System.out.println(oriImage.getWidth()+" "+oriImage.getHeight());
for(int i=0;i
for(int j=0;j
//data[i][j]=oriImage.getRGB(i,j);
//(x-a)2+(y-b)2=r2中,有三个参数a、b、r,即圆心坐标为(a,b),半径r。
double f=Math.pow((i-c_a), 2)+Math.pow((j-c_b), 2);
double f2=Math.pow((i-c2_a), 2)+Math.pow((j-c2_b), 2);
int rgb=oriImage.getRGB(i,j);
if(i>=x&&i=y&&j=rr){//在矩形内
//块范围内的值
in(newSrc, newSrc2, i, j, rgb);
}else if(f<=rr){
//在圆内
in(newSrc, newSrc2, i, j, rgb);
}else{
//剩余位置设置成透明
out(newSrc, newSrc2, i, j, rgb);
}
}
}
}
private void in(BufferedImage newSrc,BufferedImage newSrc2,int i,int j,int rgb){
newSrc.setRGB(i, j, rgb);
//原图设置变灰
int r = (0xff & rgb);
int g = (0xff & (rgb >> 8));
int b = (0xff & (rgb >> 16));
rgb = r + (g << 8) + (b << 16) + (100 << 24);
//rgb = r + (g << 8) + (b << 16);
newSrc2.setRGB(i, j, rgb);
}
private void out(BufferedImage newSrc,BufferedImage newSrc2,int i,int j,int rgb){
newSrc.setRGB(i, j, 0x00ffffff);
newSrc2.setRGB(i, j, rgb);
}
public static void main(String[]args)throws Exception {
ImageUtil tt=new ImageUtil();
//图片必须是png格式,因为需要做透明背景
//原图
BufferedImage src=ImageIO.read(new File("E:/temp/1.png"));
//移动图
BufferedImage newSrc=new BufferedImage(src.getWidth(), src.getHeight(),BufferedImage.TYPE_4BYTE_ABGR);//新建一个类型支持透明的BufferedImage
//对比图
BufferedImage newSrc2=new BufferedImage(src.getWidth(), src.getHeight(),BufferedImage.TYPE_4BYTE_ABGR);//新建一个类型支持透明的BufferedImage
//抠块的大小
int blockWidth=200;
int blockHeight=200;
Random rand1=new Random();
int x=rand1.nextInt(src.getWidth()-blockWidth-20)+20;//10,width-200
Random rand2=new Random();
int y=rand2.nextInt(src.getHeight()-blockHeight-20)+20;//
tt.cutByTemplate2(src,newSrc,newSrc2,x,y,blockWidth,blockHeight);//图片大小是固定,位置是随机
//生成移动图
ImageIO.write(newSrc, "png", new File("E:/temp/3.png"));
//生成对比图
ImageIO.write(newSrc2, "png", new File("E:/temp/4.png"));
}
}
效果图如下:
大小: 822.2 KB
查看图片附件
java 拖动验证码实现_java实现拖动图片验证码相关推荐
- java自动识别图片验证码插件_JMeter开发插件——图片验证码识别
我们在性能测试中总会时不时地遭遇到来自于应用系统的各种阻碍,图片验证码就是一类最常见的束缚,登录或交易时需要按照图片中的内容输入正确的验证信息后,数据才可以提交成功,这使得许多性能测试工具只能望而却步 ...
- java短信验证码失效时间_Java实现短信验证码--设置发送间隔时间,以及有效时间(Java+Redis)...
Java实现短信验证码--设置发送间隔时间,以及有效时间(Java+Redis) 这篇文章,实现了Java发送手机短信验证码发送的间隔时间,以及手机验证码的有效时间和手机验证码格式的合法性验证,可以防 ...
- 爬虫笔记40之反爬系列三:复杂验证码的处理(12306图片验证码、行为验证:selenium鼠标行为链 + 算法)
一.12306图片验证码 解决方案: selenium(鼠标行为链) + 打码平台 思路: 通过selenium来加载登录页面,获取验证码图片.我就可以把验证码图片交给超级鹰打码平台进行处理. ...
- php验证码大全(实例分享),php图片验证码的例子
代码如下: /** * 生成验证码图片 * site www.jbxue.com * @param String $word 验证码在session中的变量名称 */ function valiCod ...
- 仿12306验证码 java_仿12306的图片验证码
由于要做一个新项目,所以打算做一个简单的图片验证码. 先说说思路吧:在服务端,从一个文件夹里面找出8张图片,再把8张图片合并成一张大图,在8个小图里面随机生成一个要用户验证的图片分类,如小狗.啤酒等. ...
- java发送html附件_Java发送邮件(图片、附件、HTML)
一.简介 要在网络上实现邮件功能,必须要有专门的邮件服务器.这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中. SMTP服务器地址: 一般是 ...
- 如何在java中添加照片_Java如何将图片添加到PPT幻灯片中?
在Java编程中,如何将图片添加到PPT幻灯片中? 注意:需要访问网址: , 下载一个Apache POI软件包.这里下载最新版本:poi-bin-3.17-20170915.tar.gz解压并全部导 ...
- java短信验证码失效时间_java实现短信验证码5分钟有效时间
本文实例为大家分享了java实现短信验证码5分钟有效时间,供大家参考,具体内容如下 实现一个发送短信验证码的请求,要求5分钟之内重复请求,返回同一个验证码. 网上可找到几种方案: 如,存储数据库或缓存 ...
- 验证码识别之w3cschool字符图片验证码(easy级别)
起因: 最近在练习解析验证码,看到了这个网站的验证码比较简单,于是就拿来解析一下攒攒经验值,并无任何冒犯之意... 验证码所在网页: https://www.w3cschool.cn/checkmph ...
最新文章
- [Linux] Linux Shell查找文件
- 查看源代码Source not found及在eclipse中配置jdk的src.zip源代码
- Codeforces Round #163 (Div. 2) C. Below the Diagonal 分治
- zincrby redis python_【Redis数据结构 序】使用redis-py操作Redis数据库
- c++第二次上机实验项目二
- C++ 构造函数、析构函数、拷贝构造函数
- python源文件后缀_Python怎样获取文件扩展名
- jmeter简单使用
- 剑指offer面试题57. 和为s的两个数字(双指针)
- 修改FTP服务器时长,连接ftp服务器的时长怎么设置
- 读取位置时发生访问冲突 c++_王道计算机网络|第三章数据链路层1314介质访问控制...
- 多张图片合成一张jpg工具_比较好的拼图软件,多张图片合并工具
- Hadoop安装教程_单机/伪分布式配置
- php eclipse 插件下载地址,Eclipse插件-PHPEclipse插件v1.2.3 最新版下载__飞翔下载
- AutoCAD 2019 for Mac 汉化安装手册
- Nature呼吁:应对21世纪的大规模流行病,各个学科必须联合起来
- Idea安装MarkDown插件
- MSP430 DM430-A开发板学习笔记(二)MSP430f149与hc06蓝牙模块的使用
- 美国10大计算机软件,美国计算机软件工程专业研究生排名
- vue+netty+redis微信猜数对战小游戏
热门文章
- html and css3 实现分屏设计-网页前端设计 id1086
- vue官方示例__todomvc总结
- FZU2261 浪里个浪(最短路,spfa)(福州大学第十四届程序设计竞赛)
- 【cmd运行java/javac/java -version不显示信息】
- 计算机专业英语第12章在线测试,《计算机专业英语》第12章在线测试.doc
- 网友咨询:手机卡套餐可以换成流量卡套餐吗?说一说改套餐的问题!
- 小程序实现手写板签名功能
- 003、pip配置国内源
- origin账号能买吗_一名Origin用户价值上万的游戏账号被莫名删除 EA客服起初竟拒绝帮他找回丢失的账号...
- Python零基础入门篇㉕〗- Python字典的常用方法