`
jjjssh
  • 浏览: 77227 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

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); //读取原始图片
	    	Iterator<ImageReader>it=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<oriImage.getWidth();i++){
            for(int j=0;j<oriImage.getHeight();j++){
                //data[i][j]=oriImage.getRGB(i,j);
            	
            	//(x-a)²+(y-b)²=r²中,有三个参数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<(x+width) &&j>=y&&j<(y+height) && f2>=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实现点击文字验证码与拖动/滑动图片验证码(源码+demo+单元测试+实现思路)

    1.部署步骤 1.1 100%可生产使用. 1.2 导入到idea时候选择maven项目 1.3 修改demo里面子项目resources/application.yml的redis... 4.2拖动图片验证码:https://blog.csdn.net/m0_38138879/article/details/117559456

    java实现滑动验证码

    java实现滑动验证码

    Java实现的图片验证码

    在本文中,我们将深入探讨如何使用Java语言来实现一个图片验证码的系统。Java因其丰富的库和强大的面向对象特性,成为开发验证码的理想选择。 验证码的核心功能包括生成随机字符串、将字符串转化为图像以及提供用户...

    java实现拖拉验证码工具类

    实现功能:传入路径,返回base64图片编码(原图抠图及滑块图)、图片坐标值、唯一id; 使用方法:1、将jar包导入项目中; 2、调用工具类 ImageVo imageVo = GraphicCodeUtil.generate("E:\\data\\3322.jpg",width,...

    java图形拖拽验证码 滑动式验证 直接导入到eclipse里直接使用

    直接导入进eclipse中 放入tomcat服务器 输入http://127.0.0.1:8080/gt-java-sdk/login.jsp即可查看demo直接导入进eclipse中 放入tomcat服务器 输入http://127.0.0.1:8080/gt-java-sdk/login.jsp即可查看demo

    java拖动式验证码极速验证源码

    实现拖动式验证码块,实现登录验证的快捷和方便,挺不错的资源,欢迎大家下载。

    JAVA和HTML5实现的多种验证码实现

    首先,我们来看JAVA实现的验证码。JAVA作为一种广泛使用的后端编程语言,具有丰富的库和工具来创建各种类型的验证码。教程中提到的七种JAVA验证码可能包括: 1. 图片验证码:这种验证码通过生成随机的字符或数字...

    java图片滑动验证码

    在Java中实现图片滑动验证码涉及以下几个核心知识点: 1. **图像处理**:首先,你需要了解Java的图像处理库,如Java AWT和Swing中的`BufferedImage`类。这些库允许你加载、创建、修改和保存图像。在滑动验证码中,...

    java图片滑动验证(登录验证)原理与实现方法详解

    Java图片滑动验证(登录验证)原理与实现方法详解 Java图片滑动验证(登录验证)是一种常用的身份验证机制,它可以有效地防止机器人和恶意攻击。下面将详细介绍Java图片滑动验证(登录验证)的原理和实现方法。 ...

    Java,验证码,源码

    这个资源包含Java验证码的开发源码和相关的学习视频,可以帮助开发者深入理解验证码的实现原理和如何在自己的项目中应用。 验证码(CAPTCHA,Completely Automated Public Turing test to tell Computers and ...

    java实现图片滑动验证(包含前端代码)

    Java 实现图片滑动验证 Java 实现图片滑动验证是指使用 Java 语言来实现图片滑动验证功能,该功能主要用于防止机器人和恶意攻击。图片滑动验证是一种常用的验证码机制,它可以防止机器人和恶意攻击,保护网站和应用...

    图片拖动验证码土豪版

    4. **JavaScript交互**:前端页面需要与后端进行交互,接收验证码图片并处理用户拖动事件。JavaScript库如jQuery可以帮助我们轻松实现这一功能,而Ajax可以用于异步通信。 5. **用户验证**:当用户拖动元素并提交时...

    java过滤器和验证码

    在Java Web开发中,实现验证码通常包括以下步骤: 1. 生成验证码:生成随机字符串,并将其保存在服务器端的session中。 2. 显示验证码:将生成的验证码以图像形式显示在网页上。 3. 用户输入验证:用户输入验证码后...

    Java实现滑动验证码的示例代码

    Java实现滑动验证码的示例代码可以分为两个部分:后端生成抠图和背景图片,并校验用户滑动距离值;前端实现滑动交互,让用户可以滑动抠图到正确的位置。本文的示例代码可以帮助开发者更好地理解滑动验证码的实现过程...

    行为验证码(滑动拼图、点选文字),前后端(java)交互

    用户与验证码进行交互,例如拖动滑块将拼图复原,前端会捕获这个动作并生成相应的验证数据。 - **Android**:在Android应用中,可以使用自定义视图来实现滑动验证码,或者集成第三方库(如SlideCaptcha)。用户操作...

    Java滑动验证码源码

    首先,滑动验证码的核心原理在于生成一个含有可移动部分的图片,用户需要通过拖动滑块来完成验证。这种验证方式既考验了用户的交互能力,又增加了机器自动识别的难度,有效防止了大部分自动化的攻击。 在Java中实现...

    验证码软件包.zip

    软件包通常会包含生成验证码图片、处理用户输入、验证用户答案以及更新会话状态等功能模块。 在实现Web站点的验证码功能时,主要涉及以下几个步骤: 1. **生成验证码**:软件包内部会有一个生成器,它随机生成一组...

    动态滑动后端验证码实现

    这种验证码系统通过在用户界面生成一幅含有部分遮挡图像的图片,用户需要通过拖动滑块来拼合完整的图像以证明其是真人操作。以下是关于该主题的详细知识: 1. **验证码原理**: - 验证码的目的是为了增加自动化...

    时钟验证码,java

    验证码图片通常包含一个数字或字母乱序组合,而时钟验证码则是一个模拟时钟的图像,用户需要根据提示将时针和分针移动到正确的位置。后台服务器会生成一个随机的时间(小时和分钟),并将其编码为图像中的隐藏信息。...

Global site tag (gtag.js) - Google Analytics