最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼生成(后端工具類)

 更新時(shí)間:2022年10月27日 14:49:39   作者:weixin_52707625  
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼生成功能中的后端工具類部分,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

一、滑動(dòng)驗(yàn)證碼生成思路

1、隨機(jī)選擇一張圖片

2、生成滑塊起點(diǎn)位置(x, y)

3、生成滑塊輪廓

4、摳出滑塊

5、將滑塊部位去除顏色

二、主要方法

這里使用的方法是:先摳出中間的正方形,再將凹凸槽的RGB渲染上去

1、扣主體

將自定義滑塊大小擴(kuò)大三分之二,用來做凸槽

2、摳凸槽

因?yàn)橥共凼莻€(gè)圓,所以可通過圓的標(biāo)準(zhǔn)方程

三、生成代碼

滑塊驗(yàn)證碼實(shí)體類

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author: Yang
 * @create: 2022-10-25
 * @Description: 滑動(dòng)驗(yàn)證碼實(shí)體
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ImageSlideVerify {

    private String bgImg;// 底部圖片
    private String blockImg;// 滑塊圖片
    private Integer x;// 開始x
    private Integer y;// 開始y
    private Integer bound;// 誤差值
}

生成滑塊驗(yàn)證碼

import com.yang.domain.vo.ImageSlideVerify;
import org.apache.tomcat.util.codec.binary.Base64;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Random;
import java.util.UUID;

import javax.imageio.ImageIO;

/**
 * 滑動(dòng)驗(yàn)證碼
 * @author Yang
 *
 */
public class ImageSlideVerifyUtil {
	
	private static Integer x, y;// x , y軸起點(diǎn)位置
	private static Integer blockSize; // 塊大小

	public static void main(String[] args) throws IOException {
		File file = new File("4.jpeg");
		cutting(file, 80);
		cutting(file);
	}
	
	
	// 切割
	public static ImageSlideVerify cutting(File file, int size) {
		FileInputStream fis;
		blockSize = size;
		
		try {
			fis = new FileInputStream(file);
			BufferedImage image = ImageIO.read(fis);// 將文件流轉(zhuǎn)圖像流
			
			// 生成圓位置
			Integer cp[] = circle();// 下標(biāo)對(duì)應(yīng):上右下左
			
			// 生成滑塊
			BufferedImage img = generateMin(image, image.getWidth(), image.getHeight(), size, cp);
			// 圖片轉(zhuǎn)base64
			String bgImg = imageToBase64(image);
			String blockImg = imageToBase64(img);
			// TODO 保存圖片:用于測(cè)試,測(cè)試完畢刪除
			// ImageIO.write(img, "png", new File("4-1.png"));
			// ImageIO.write(image, "png", new File("4-2.png"));
			
			ImageSlideVerify imageSlideVerify = new ImageSlideVerify(bgImg, blockImg, x, y, 3);

			return imageSlideVerify;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
	// 切割
	public static ImageSlideVerify cutting(File file) {
		return cutting(file, 60);
	}
	
	// 圓的位置
	private static Integer[] circle() {
		
		Integer c[] = new Integer[4];// 四個(gè)位置有圓,0代表無,1代表有,下標(biāo)對(duì)應(yīng)上、右、下、左
		boolean flag = false;// 記錄是否有圓
		while(!flag) {// 如果沒有圓,則繼續(xù)循環(huán),至少要有一個(gè)圓(凸槽)
			for(int i = 0; i < 4; i++) {
				c[i] = new Random().nextInt(2);
				if(c[i] == 1) {
					flag = true;
				}
			}
		}
		return c;
	}
	
	/**
	 * 生成小滑塊位置
	 * @param img
	 * @param width 圖片寬度
	 * @param height 圖片高度
	 * @param size 滑塊大小, 正方形,寬高相等
	 * @return
	 * @throws IOException 
	 */
	private static BufferedImage generateMin(BufferedImage img, int width, int height, int size, Integer[] cp) throws IOException {

		/**
		 * 滑塊大小:定義大小 + 三分之一
		 */
		int size1 = size + (size / 3 * 2);
		/**
		 * 最大起點(diǎn)位置
		 * 	x:寬度 - 滑塊大小
		 *  y:高度 - 滑塊大小
		 */
		int maxX = width - ( size1 );
		int maxY = height - ( size1 );
		
		// 生成滑塊開始位置
		x = new Random().nextInt(maxX);
		y = new Random().nextInt(maxY);
		// 創(chuàng)建滑塊圖像
		BufferedImage img1 = new BufferedImage(size1, size1, BufferedImage.TYPE_INT_RGB);
		Graphics2D gr = img1.createGraphics();
		// 圖像背景透明
		img1 = gr.getDeviceConfiguration().createCompatibleImage(size1, size1, Transparency.TRANSLUCENT);
		
		// 拷貝rgb
		for(int i = 0; i < size1; i++) {
			for(int j = 0; j < size1; j++) {
				if(i < size / 3 || i > size + size / 3 || j < size / 3 || j > size + size / 3) {
					continue;
				}
				// 渲染RGB
				img1.setRGB(i, j, img.getRGB(i + x, j + y));
				// 將原圖像素點(diǎn)覆蓋白色
				Color color = new Color(255,255,255);
				img.setRGB(i + x, j + y, color.getRGB());
			}
		}
		// 設(shè)置圓(凸槽)
		setCircle(img, img1, x, y, cp);
		return img1;
	}
	/**
	 * 設(shè)置圓
	 * @param oldImg
	 * @param img
	 * @param x
	 * @param y
	 * @param cp
	 * @throws IOException 
	 */
	private static void setCircle(BufferedImage oldImg, BufferedImage img, int x, int y, Integer[] cp) throws IOException {
		// 以白色覆蓋原圖像素點(diǎn)
		Color color = new Color(255,255,255);

		int d = blockSize / 3 + 2; // 直徑
		int r = d / 2;// 半徑
		/**
		 * TODO 以下待改進(jìn)
		 */
		if(cp[0] == 1) {// 上
			// 中心位置
			int w = img.getWidth() / 2;
			
			for(int i = w - r, r1 = 0; i < w + r; i++, r1++) {
				for(int j = 0, r2 = 0; j < d; j++, r2++) {
					/**
					 * 判斷點(diǎn)是否在圓內(nèi):點(diǎn)p(x, y), 圓心r(x, y)
					 * 有:(px - rx)^2 + (py - ry)^2 <= rx*ry
					 */
					if((r1 - r) * (r1 - r) + (r2 - r) * (r2 - 11) <= r * r) {
						if(oldImg.getRGB(x + i, y + j) == color.getRGB()) {
							continue;
						}
						img.setRGB(i, j, oldImg.getRGB(x + i, y + j));
						// 對(duì)應(yīng)位置透明
						oldImg.setRGB(x + i, y + j, color.getRGB());
					}
				}
			}
		}
		if(cp[1] == 1) {// 右
			// 中心位置
			int h = img.getHeight() / 2;
			for(int i = img.getWidth() - d, r1 = 0; i < img.getWidth(); i++, r1++) {
				for(int j = h - r, r2 = 0; j < h + r; j++, r2++) {
					if((r1 - r) * (r1 - r) + (r2 - r) * (r2 - r) <= r * r) {
						if(oldImg.getRGB(x + i, y + j) == color.getRGB()) continue;
						img.setRGB(i, j, oldImg.getRGB(x + i, y + j));
						// 對(duì)應(yīng)位置透明
						oldImg.setRGB(x + i, y + j, color.getRGB());
					}
				}
			}
		}
		if(cp[2] == 1) {// 下
			// 中心位置
			int w = img.getWidth() / 2;
			
			for(int i = w - r, r1 = 0; i < w + r; i++, r1++) {
				for(int j = img.getHeight() - d, r2 = 0; j < img.getHeight(); j++, r2++) {
					if((r1 - r) * (r1 - r) + (r2 - r) * (r2 - r) <= r * r) {
						if(oldImg.getRGB(x + i, y + j) == color.getRGB()) continue;
						img.setRGB(i, j, oldImg.getRGB(x + i, y + j));
						// 對(duì)應(yīng)位置透明
						oldImg.setRGB(x + i, y + j, color.getRGB());
					}
				}
			}
		}
		if(cp[3] == 1) {// 左
			// 中心位置
			int h = img.getHeight() / 2;
			for(int i = 0, r1 = 0; i < d; i++, r1++) {
				for(int j = h - r, r2 = 0; j < h + r; j++, r2++) {
					if((r1 - r) * (r1 - r) + (r2 - r) * (r2 - r) <= r * r) {
						if(oldImg.getRGB(x + i, y + j) == color.getRGB()) continue;
						img.setRGB(i, j, oldImg.getRGB(x + i, y + j));
						// 對(duì)應(yīng)位置透明
						oldImg.setRGB(x + i, y + j, color.getRGB());
					}
				}
			}
		}
	}

	/**
	 * 圖像轉(zhuǎn)base64
	 * @param img
	 * @return
	 */
	private static String imageToBase64(BufferedImage img){
		ByteArrayOutputStream stream = new ByteArrayOutputStream();
		try {
			// 設(shè)置圖片的格式
			ImageIO.write(img, "png", stream);
			byte[] bytes = Base64.encodeBase64(stream.toByteArray());
			String base64 = new String(bytes);
			return  "data:image/jpeg;base64,"+base64;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
}

四、測(cè)試結(jié)果

這里看滑塊是白色背景,實(shí)際上是透明的

生成完成

web前端代碼

到此這篇關(guān)于Java實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼生成(后端工具類)的文章就介紹到這了,更多相關(guān)Java滑動(dòng)驗(yàn)證碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IDEA使用Mybatis插件 MyBatisCodeHelper-Pro的圖文教程

    IDEA使用Mybatis插件 MyBatisCodeHelper-Pro的圖文教程

    這篇文章主要介紹了IDEA使用Mybatis插件 MyBatisCodeHelper-Pro的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • java中字符串替換常用的4種方法

    java中字符串替換常用的4種方法

    在Java中String類提供了許多方便的方法來處理字符串,下面這篇文章主要給大家介紹了關(guān)于java中字符串替換常用的4種方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • spring 重復(fù)注解和aop攔截的實(shí)現(xiàn)示例

    spring 重復(fù)注解和aop攔截的實(shí)現(xiàn)示例

    本文主要介紹了spring 重復(fù)注解和aop攔截的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • 詳解Java中自定義注解的使用

    詳解Java中自定義注解的使用

    Annontation是Java5開始引入的新特征,中文名稱叫注解,它提供了一種安全的類似注釋的機(jī)制,用來將任何的信息或元數(shù)據(jù)(metadata)與程序元素(類、方法、成員變量等)進(jìn)行關(guān)聯(lián)。本文主要介紹了自定義注解的使用,希望對(duì)大家有所幫助
    2023-03-03
  • Java利用Jackson序列化實(shí)現(xiàn)數(shù)據(jù)脫敏

    Java利用Jackson序列化實(shí)現(xiàn)數(shù)據(jù)脫敏

    這篇文章主要介紹了利用Jackson序列化實(shí)現(xiàn)數(shù)據(jù)脫敏,首先在需要進(jìn)行脫敏的VO字段上面標(biāo)注相關(guān)脫敏注解,具體實(shí)例代碼文中給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10
  • 詳解Java基礎(chǔ)知識(shí)——JDBC

    詳解Java基礎(chǔ)知識(shí)——JDBC

    這篇文章主要介紹了Java基礎(chǔ)知識(shí)——JDBC,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • SpringBoot使用Sa-Token實(shí)現(xiàn)權(quán)限認(rèn)證

    SpringBoot使用Sa-Token實(shí)現(xiàn)權(quán)限認(rèn)證

    本文主要介紹了SpringBoot使用Sa-Token實(shí)現(xiàn)權(quán)限認(rèn)證,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • java中的export方法實(shí)現(xiàn)導(dǎo)出excel文件

    java中的export方法實(shí)現(xiàn)導(dǎo)出excel文件

    這篇文章主要介紹了java中的export方法實(shí)現(xiàn)導(dǎo)出excel文件,文章圍繞java導(dǎo)出excel文件的相關(guān)資料展開詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-03-03
  • SpringBoot實(shí)現(xiàn)過濾器、攔截器與切片的實(shí)現(xiàn)和區(qū)別

    SpringBoot實(shí)現(xiàn)過濾器、攔截器與切片的實(shí)現(xiàn)和區(qū)別

    本文詳細(xì)介紹了使用過濾器、攔截器與切片實(shí)現(xiàn)每個(gè)請(qǐng)求耗時(shí)的統(tǒng)計(jì),并比較三者的區(qū)別與聯(lián)系,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-02-02
  • 分析JVM的組成結(jié)構(gòu)

    分析JVM的組成結(jié)構(gòu)

    JVM(虛擬機(jī)):指以軟件的方式模擬具有完整硬件系統(tǒng)功能、運(yùn)行在一個(gè)完全隔離環(huán)境中的完整計(jì)算機(jī)系統(tǒng) ,是物理機(jī)的軟件實(shí)現(xiàn)。JVM和VMware,Virtual Box等虛擬機(jī)一樣,都是運(yùn)行在操作系統(tǒng)之上的計(jì)算機(jī)系統(tǒng)
    2021-06-06

最新評(píng)論

武陟县| 准格尔旗| 屏边| 怀来县| 灌阳县| SHOW| 突泉县| 马边| 根河市| 镇宁| 理塘县| 梅州市| 开平市| 珠海市| 苏尼特左旗| 丹巴县| 赤壁市| 莆田市| 三江| 遵义县| 桐城市| 永靖县| 永昌县| 壤塘县| 乐亭县| 奉节县| 浦江县| 奇台县| 桐柏县| 宁夏| 西和县| 潼关县| 宜章县| 西昌市| 繁峙县| 栾川县| 临夏县| 综艺| 无为县| 开江县| 景谷|