欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java圖片滑動(dòng)驗(yàn)證(登錄驗(yàn)證)原理與實(shí)現(xiàn)方法詳解

 更新時(shí)間:2019年09月28日 11:21:50   作者:我走小路  
這篇文章主要介紹了java圖片滑動(dòng)驗(yàn)證(登錄驗(yàn)證)原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了java圖片滑動(dòng)登錄驗(yàn)證的相關(guān)原理、實(shí)現(xiàn)方法與操作技巧,需要的朋友可以參考下

本文實(shí)例講述了java圖片滑動(dòng)驗(yàn)證(登錄驗(yàn)證)原理與實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:

這是我簡(jiǎn)單做出的效果圖,處理300X150px的校驗(yàn)圖,并把圖片發(fā)到前端,用時(shí)50毫秒左右,速度還是非??斓摹?/p>

 

原理:

1.利用java從大圖中隨機(jī)摳出一張小圖,并在大圖上給摳出小圖的位置加陰影,然后把這兩張圖片返回給前端;

2.前端獲取圖片,用戶滑動(dòng)小圖到陰影的位置,獲取小圖滑動(dòng)的距離,返回給java后臺(tái)進(jìn)行校驗(yàn);

3.校驗(yàn)通過,返回校驗(yàn)通過編號(hào);

4.前端調(diào)登錄接口,把賬號(hào)、密碼、和校驗(yàn)編號(hào)傳到Java后臺(tái)進(jìn)行登錄。

實(shí)現(xiàn):

1.計(jì)算需要的小圖輪廓,用二維數(shù)組來表示,二維數(shù)組有兩張值,0和1,其中0表示沒有顏色,1有顏色,如下圖,我要摳圖的輪廓是這樣的:

左邊和下邊有有半圓,這個(gè)根據(jù)圓的公式就可以了,代碼示例:

static int targetLength=55;//小圖長(zhǎng)
static int targetWidth=45;//小圖寬
static int circleR=6;//半徑
static int r1=3;//距離點(diǎn)
/**
 * 
* @Createdate: 2019年1月24日上午10:52:42
* @Title: getBlockData
* @Description: 生成小圖輪廓
* @author mzl
* @return int[][]
* @throws
 */
private static int[][] getBlockData() {
    int[][] data = new int[targetLength][targetWidth];
    double x2 = targetLength-circleR;
    //隨機(jī)生成圓的位置
    double h1 = circleR + Math.random() * (targetWidth-3*circleR-r1);
    double po = circleR*circleR;
    double xbegin = targetLength-circleR-r1;
    double ybegin = targetWidth-circleR-r1;
    for (int i = 0; i < targetLength; i++) {
        for (int j = 0; j < targetWidth; j++) {
            double d3 = Math.pow(i - x2,2) + Math.pow(j - h1,2);
            double d2 = Math.pow(j-2,2) + Math.pow(i - h1,2);
            if ((j <= ybegin && d2 <= po)||(i >= xbegin && d3 >= po)) {
                data[i][j] = 0;
            } else {
                data[i][j] = 1;
            }
        }
    }
    return data;
}

2.根據(jù)計(jì)算處理的小圖輪廓,在大圖上摳圖

/**
 * 
* @Createdate: 2019年1月24日上午10:51:30
* @Title: cutByTemplate
* @Description: 生成小圖片、給大圖片添加陰影
* @author mzl
* @param oriImage
* @param targetImage
* @param templateImage
* @param x
* @param y void
* @throws
 */
private static void cutByTemplate(BufferedImage oriImage,BufferedImage targetImage, int[][] templateImage, int x,int y){
    for (int i = 0; i < targetLength; i++) {
        for (int j = 0; j < targetWidth; j++) {
            int rgb = templateImage[i][j];
            // 原圖中對(duì)應(yīng)位置變色處理
            int rgb_ori = oriImage.getRGB(x + i, y + j);
            if (rgb == 1) {
      //摳圖上復(fù)制對(duì)應(yīng)顏色值
                targetImage.setRGB(i, j, rgb_ori);
      //原圖對(duì)應(yīng)位置顏色變化
                oriImage.setRGB(x + i, y + j, rgb_ori & 0x363636 );
            }else{
                //這里把背景設(shè)為透明
                targetImage.setRGB(i, j, rgb_ori & 0x00ffffff);
            }
        }
    }
}

3.把大圖小圖轉(zhuǎn)base64碼,方便返回給前端

/**
 * 
* @Createdate: 2019年1月24日上午11:49:42
* @Title: createImage
* @Description: 獲取大圖,小圖Base64碼
* @author mzl
* @param url
* @return Map<String,String>
* @throws
 */
public static Map<String,String> createImage(String url,int L,int W,Map<String,String> resultMap){
     try {
         BufferedImage bufferedImage = ImageIO.read(new FileInputStream(url));
         BufferedImage target= new BufferedImage(targetLength, targetWidth, BufferedImage.TYPE_4BYTE_ABGR);
         cutByTemplate(bufferedImage,target,getBlockData(),L,W);
         resultMap.put("b", getImageBASE64(bufferedImage));//大圖
         resultMap.put("s", getImageBASE64(target));//小圖
    } catch (IOException e) {
        e.printStackTrace();
    }finally{
        return resultMap;
    }
}
/**
* 
* @Createdate: 2019年1月24日上午11:14:19
* @Title: getImageStr
* @Description: 圖片轉(zhuǎn)BASE64
* @author mzl
* @param image
* @return
* @throws IOException String
* @throws
*/
public static String getImageBASE64(BufferedImage image) throws IOException {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ImageIO.write(image,"png",out);
        byte[] b = out.toByteArray();//轉(zhuǎn)成byte數(shù)組
    BASE64Encoder encoder = new BASE64Encoder();
    return encoder.encode(b);//生成base64編碼 
}

到此圖片驗(yàn)證關(guān)鍵代碼完畢。

更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • java驗(yàn)證電話號(hào)碼的方法

    java驗(yàn)證電話號(hào)碼的方法

    這篇文章主要介紹了java驗(yàn)證電話號(hào)碼的方法,需要的朋友可以參考下
    2014-02-02
  • 以實(shí)例簡(jiǎn)介Java中線程池的工作特點(diǎn)

    以實(shí)例簡(jiǎn)介Java中線程池的工作特點(diǎn)

    這篇文章主要介紹了以實(shí)例簡(jiǎn)介Java中線程池的工作特點(diǎn),線程池是Java實(shí)現(xiàn)多線程編程的基礎(chǔ),需要的朋友可以參考下
    2015-09-09
  • java數(shù)據(jù)結(jié)構(gòu)之java實(shí)現(xiàn)棧

    java數(shù)據(jù)結(jié)構(gòu)之java實(shí)現(xiàn)棧

    這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)棧,需要的朋友可以參考下
    2014-03-03
  • SpringBoot整合Echarts實(shí)現(xiàn)用戶人數(shù)和性別展示功能(詳細(xì)步驟)

    SpringBoot整合Echarts實(shí)現(xiàn)用戶人數(shù)和性別展示功能(詳細(xì)步驟)

    這篇文章主要介紹了SpringBoot整合Echarts實(shí)現(xiàn)用戶人數(shù)和性別展示,通過數(shù)據(jù)庫設(shè)計(jì)、實(shí)現(xiàn)數(shù)據(jù)訪問層、業(yè)務(wù)邏輯層和控制層的代碼編寫,以及前端頁面的開發(fā),本文詳細(xì)地介紹了SpringBoot整合Echarts的實(shí)現(xiàn)步驟和代碼,需要的朋友可以參考下
    2023-05-05
  • Java SpringBoot容器注入對(duì)象詳解

    Java SpringBoot容器注入對(duì)象詳解

    本文通過實(shí)例代碼給大家詳解了springboot獲取ioc容器中注入的bean問題,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-09-09
  • 使用IDEA如何打包發(fā)布SpringBoot并部署到云服務(wù)器

    使用IDEA如何打包發(fā)布SpringBoot并部署到云服務(wù)器

    這篇文章主要介紹了使用IDEA如何打包發(fā)布SpringBoot并部署到云服務(wù)器問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 關(guān)于報(bào)錯(cuò)IDEA Terminated with exit code 1的解決方法

    關(guān)于報(bào)錯(cuò)IDEA Terminated with exit code 

    如果在IDEA構(gòu)建項(xiàng)目時(shí)遇到下面這樣的報(bào)錯(cuò)IDEA Terminated with exit code 1,那必然是Maven的設(shè)置參數(shù)重置了,導(dǎo)致下載錯(cuò)誤引起的,本文給大家分享兩種解決方法,需要的朋友可以參考下
    2022-08-08
  • springcloud如何獲取網(wǎng)關(guān)封裝的頭部信息

    springcloud如何獲取網(wǎng)關(guān)封裝的頭部信息

    這篇文章主要介紹了springcloud獲取網(wǎng)關(guān)封裝的頭部信息,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • 最新評(píng)論