思路是,对原图产生两张图片,一张是底图,被抠掉一部分的图片,另外一张是移动图,被抠出的来部分

只写了后台怎么生成拖动验证码的两个图片,前端的还没写,待续。以下是后台的代码

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实现拖动图片验证码相关推荐

  1. java自动识别图片验证码插件_JMeter开发插件——图片验证码识别

    我们在性能测试中总会时不时地遭遇到来自于应用系统的各种阻碍,图片验证码就是一类最常见的束缚,登录或交易时需要按照图片中的内容输入正确的验证信息后,数据才可以提交成功,这使得许多性能测试工具只能望而却步 ...

  2. java短信验证码失效时间_Java实现短信验证码--设置发送间隔时间,以及有效时间(Java+Redis)...

    Java实现短信验证码--设置发送间隔时间,以及有效时间(Java+Redis) 这篇文章,实现了Java发送手机短信验证码发送的间隔时间,以及手机验证码的有效时间和手机验证码格式的合法性验证,可以防 ...

  3. 爬虫笔记40之反爬系列三:复杂验证码的处理(12306图片验证码、行为验证:selenium鼠标行为链 + 算法)

    一.12306图片验证码 ​ 解决方案: selenium(鼠标行为链) + 打码平台 ​ 思路: 通过selenium来加载登录页面,获取验证码图片.我就可以把验证码图片交给超级鹰打码平台进行处理. ...

  4. php验证码大全(实例分享),php图片验证码的例子

    代码如下: /** * 生成验证码图片 * site www.jbxue.com * @param String $word 验证码在session中的变量名称 */ function valiCod ...

  5. 仿12306验证码 java_仿12306的图片验证码

    由于要做一个新项目,所以打算做一个简单的图片验证码. 先说说思路吧:在服务端,从一个文件夹里面找出8张图片,再把8张图片合并成一张大图,在8个小图里面随机生成一个要用户验证的图片分类,如小狗.啤酒等. ...

  6. java发送html附件_Java发送邮件(图片、附件、HTML)

    一.简介 要在网络上实现邮件功能,必须要有专门的邮件服务器.这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中. SMTP服务器地址: 一般是 ...

  7. 如何在java中添加照片_Java如何将图片添加到PPT幻灯片中?

    在Java编程中,如何将图片添加到PPT幻灯片中? 注意:需要访问网址: , 下载一个Apache POI软件包.这里下载最新版本:poi-bin-3.17-20170915.tar.gz解压并全部导 ...

  8. java短信验证码失效时间_java实现短信验证码5分钟有效时间

    本文实例为大家分享了java实现短信验证码5分钟有效时间,供大家参考,具体内容如下 实现一个发送短信验证码的请求,要求5分钟之内重复请求,返回同一个验证码. 网上可找到几种方案: 如,存储数据库或缓存 ...

  9. 验证码识别之w3cschool字符图片验证码(easy级别)

    起因: 最近在练习解析验证码,看到了这个网站的验证码比较简单,于是就拿来解析一下攒攒经验值,并无任何冒犯之意... 验证码所在网页: https://www.w3cschool.cn/checkmph ...

最新文章

  1. [Linux] Linux Shell查找文件
  2. 查看源代码Source not found及在eclipse中配置jdk的src.zip源代码
  3. Codeforces Round #163 (Div. 2) C. Below the Diagonal 分治
  4. zincrby redis python_【Redis数据结构 序】使用redis-py操作Redis数据库
  5. c++第二次上机实验项目二
  6. C++ 构造函数、析构函数、拷贝构造函数
  7. python源文件后缀_Python怎样获取文件扩展名
  8. jmeter简单使用
  9. 剑指offer面试题57. 和为s的两个数字(双指针)
  10. 修改FTP服务器时长,连接ftp服务器的时长怎么设置
  11. 读取位置时发生访问冲突 c++_王道计算机网络|第三章数据链路层1314介质访问控制...
  12. 多张图片合成一张jpg工具_比较好的拼图软件,多张图片合并工具
  13. Hadoop安装教程_单机/伪分布式配置
  14. php eclipse 插件下载地址,Eclipse插件-PHPEclipse插件v1.2.3 最新版下载__飞翔下载
  15. AutoCAD 2019 for Mac 汉化安装手册
  16. Nature呼吁:应对21世纪的大规模流行病,各个学科必须联合起来
  17. Idea安装MarkDown插件
  18. MSP430 DM430-A开发板学习笔记(二)MSP430f149与hc06蓝牙模块的使用
  19. 美国10大计算机软件,美国计算机软件工程专业研究生排名
  20. vue+netty+redis微信猜数对战小游戏

热门文章

  1. html and css3 实现分屏设计-网页前端设计 id1086
  2. vue官方示例__todomvc总结
  3. FZU2261 浪里个浪(最短路,spfa)(福州大学第十四届程序设计竞赛)
  4. 【cmd运行java/javac/java -version不显示信息】
  5. 计算机专业英语第12章在线测试,《计算机专业英语》第12章在线测试.doc
  6. 网友咨询:手机卡套餐可以换成流量卡套餐吗?说一说改套餐的问题!
  7. 小程序实现手写板签名功能
  8. 003、pip配置国内源
  9. origin账号能买吗_一名Origin用户价值上万的游戏账号被莫名删除 EA客服起初竟拒绝帮他找回丢失的账号...
  10. Python零基础入门篇㉕〗- Python字典的常用方法