<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      加了一個轉成了Base64編碼。,其他的和網上一樣。

        1 public class ValidateCodeUtil {
        2 
        3     // 圖片的寬度。
        4     private int width = 160;
        5     // 圖片的高度。
        6     private int height = 40;
        7     // 驗證碼字符個數
        8     private int codeCount = 5;
        9     // 驗證碼干擾線數
       10     private int lineCount = 150;
       11     // 驗證碼
       12     private String code = null;
       13     // 驗證碼圖片Buffer
       14     private BufferedImage buffImg = null;
       15 
       16     private String base64 = null;
       17 
       18     public String getBase64() {
       19         try {
       20             base64 = getBase64(buffImg);
       21         } catch (Exception e) {
       22             System.out.println("轉換失敗");
       23         }
       24         return base64;
       25     }
       26 
       27     // 驗證碼范圍,去掉0(數字)和O(拼音)容易混淆的(小寫的1和L也可以去掉,大寫不用了)
       28     private char[] codeSequence = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
       29             'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
       30             'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
       31 
       32     /**
       33      * 默認構造函數,設置默認參數
       34      */
       35     public ValidateCodeUtil() {
       36         this.createCode();
       37     }
       38 
       39     /**
       40      * @param width  圖片寬
       41      * @param height 圖片高
       42      */
       43     public ValidateCodeUtil(int width, int height) {
       44         this.width = width;
       45         this.height = height;
       46         this.createCode();
       47     }
       48 
       49     /**
       50      * @param width     圖片寬
       51      * @param height    圖片高
       52      * @param codeCount 字符個數
       53      * @param lineCount 干擾線條數
       54      */
       55     public ValidateCodeUtil(int width, int height, int codeCount, int lineCount) {
       56         this.width = width;
       57         this.height = height;
       58         this.codeCount = codeCount;
       59         this.lineCount = lineCount;
       60         this.createCode();
       61     }
       62 
       63     public void createCode() {
       64         int x = 0, fontHeight = 0, codeY = 0;
       65         int red = 0, green = 0, blue = 0;
       66 
       67         x = width / (codeCount + 2);//每個字符的寬度(左右各空出一個字符)
       68         fontHeight = height - 2;//字體的高度
       69         codeY = height - 4;
       70 
       71         // 圖像buffer
       72         buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
       73         Graphics2D g = buffImg.createGraphics();
       74 
       75         /*// 將圖像背景填充為白色
       76         g.setColor(Color.WHITE);
       77         g.fillRect(0, 0, width, height);*/
       78         // 增加下面代碼使得背景透明
       79         buffImg = g.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
       80         g.dispose();
       81         g = buffImg.createGraphics();
       82         // 背景透明代碼結束
       83 
       84         // 畫圖BasicStroke是JDK中提供的一個基本的畫筆類,我們對他設置畫筆的粗細,就可以在drawPanel上任意畫出自己想要的圖形了。
       85         g.setColor(new Color(255, 0, 0));
       86         g.setStroke(new BasicStroke(1f));
       87         g.fillRect(128, 128, width, height);
       88 
       89         // 生成隨機數
       90         Random random = new Random();
       91         //設置字體類型、字體大小、字體樣式 
       92         Font font = new Font("微軟雅黑", Font.PLAIN, fontHeight);
       93 
       94         g.setFont(font);
       95 
       96         for (int i = 0; i < lineCount; i++) {
       97             // 設置隨機開始和結束坐標
       98             int xs = random.nextInt(width);//x坐標開始
       99             int ys = random.nextInt(height);//y坐標開始
      100             int xe = xs + random.nextInt(width / 8);//x坐標結束
      101             int ye = ys + random.nextInt(height / 8);//y坐標結束
      102 
      103             // 產生隨機的顏色值,讓輸出的每個干擾線的顏色值都將不同。
      104             red = random.nextInt(255);
      105             green = random.nextInt(255);
      106             blue = random.nextInt(255);
      107             g.setColor(new Color(red, green, blue));
      108             g.drawLine(xs, ys, xe, ye);
      109         }
      110 
      111         // randomCode記錄隨機產生的驗證碼
      112         StringBuffer randomCode = new StringBuffer();
      113         // 隨機產生codeCount個字符的驗證碼。
      114         for (int i = 0; i < codeCount; i++) {
      115             String strRand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);
      116             // 產生隨機的顏色值,讓輸出的每個字符的顏色值都將不同。
      117             red = random.nextInt(255);
      118             green = random.nextInt(255);
      119             blue = random.nextInt(255);
      120             //指定某種顏色
      121             //g.setColor(new Color(252, 145, 83));
      122             g.setColor(new Color(red, green, blue));
      123             g.drawString(strRand, (i + 1) * x, codeY);
      124             // 將產生的四個隨機數組合在一起。
      125             randomCode.append(strRand);
      126         }
      127         // 將四位數字的驗證碼保存到Session中。
      128         code = randomCode.toString();
      129     }
      130 
      131     public void write(String path) throws IOException {
      132         OutputStream sos = new FileOutputStream(path);
      133         this.write(sos);
      134     }
      135 
      136     public void write(OutputStream sos) throws IOException {
      137         ImageIO.write(buffImg, "png", sos);
      138         sos.close();
      139     }
      140 
      141     public BufferedImage getBuffImg() {
      142         return buffImg;
      143     }
      144 
      145     public String getCode() {
      146         return code;
      147     }
      148 
      149     public static void main(String[] args) {
      150         ValidateCodeUtil vCode = new ValidateCodeUtil();
      151         Map<String, Object> map = new HashMap<>(16);
      152         map.put("code",vCode.getCode());
      153         map.put("image",vCode.getBase64());
      154         System.out.println(map);
      155     }
      156 
      157     /**
      158      * 轉換成圖片格式
      159      * @param buffImg
      160      * @return
      161      * @throws Exception
      162      */
      163     private static String getBase64(BufferedImage buffImg) throws Exception {
      164         ByteArrayOutputStream out = new ByteArrayOutputStream();
      165         ImageIO.write(buffImg, "png", out);
      166         byte[] bytes = out.toByteArray();
      167         out.close();
      168         String base64bytes = "data:image/png;base64," + Base64Util.encode(bytes);
      169         return base64bytes;
      170     }
      171 }

      Base64Util

        1 public class Base64Util {
        2 
        3     static private final int BASELENGTH = 128;
        4     static private final int LOOKUPLENGTH = 64;
        5     static private final int TWENTYFOURBITGROUP = 24;
        6     static private final int EIGHTBIT = 8;
        7     static private final int SIXTEENBIT = 16;
        8     static private final int FOURBYTE = 4;
        9     static private final int SIGN = -128;
       10     static private final char PAD = '=';
       11     static private final boolean fDebug = false;
       12     static final private byte[] base64Alphabet = new byte[BASELENGTH];
       13     static final private char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH];
       14 
       15 
       16     static {
       17         for (int i = 0; i < BASELENGTH; ++i) {
       18             base64Alphabet[i] = -1;
       19         }
       20         for (int i = 'Z'; i >= 'A'; i--) {
       21             base64Alphabet[i] = (byte) (i - 'A');
       22         }
       23         for (int i = 'z'; i >= 'a'; i--) {
       24             base64Alphabet[i] = (byte) (i - 'a' + 26);
       25         }
       26 
       27         for (int i = '9'; i >= '0'; i--) {
       28             base64Alphabet[i] = (byte) (i - '0' + 52);
       29         }
       30 
       31         base64Alphabet['+'] = 62;
       32         base64Alphabet['/'] = 63;
       33 
       34         for (int i = 0; i <= 25; i++) {
       35             lookUpBase64Alphabet[i] = (char) ('A' + i);
       36         }
       37 
       38         for (int i = 26, j = 0; i <= 51; i++, j++) {
       39             lookUpBase64Alphabet[i] = (char) ('a' + j);
       40         }
       41 
       42         for (int i = 52, j = 0; i <= 61; i++, j++) {
       43             lookUpBase64Alphabet[i] = (char) ('0' + j);
       44         }
       45         lookUpBase64Alphabet[62] = (char) '+';
       46         lookUpBase64Alphabet[63] = (char) '/';
       47 
       48     }
       49 
       50 
       51     /**
       52      * base64 編碼
       53      *
       54      * @param str
       55      * @return
       56      */
       57     public static String encoder(String str) {
       58         final Base64.Encoder encoder = Base64.getEncoder();
       59         String strEncoder = null;
       60         try {
       61             strEncoder = encoder.encodeToString(str.getBytes("UTF-8"));
       62         } catch (UnsupportedEncodingException e) {
       63             e.printStackTrace();
       64         }
       65         return strEncoder;
       66     }
       67 
       68     /**
       69      * Encodes hex octects into Base64 
       70      *
       71      * @param binaryData Array containing binaryData 
       72      * @return Encoded Base64 array 
       73      */
       74     public static String encode(byte[] binaryData) {
       75 
       76         if (binaryData == null) {
       77             return null;
       78         }
       79 
       80         int lengthDataBits = binaryData.length * EIGHTBIT;
       81         if (lengthDataBits == 0) {
       82             return "";
       83         }
       84 
       85         int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP;
       86         int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP;
       87         int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets;
       88         char encodedData[] = null;
       89 
       90         encodedData = new char[numberQuartet * 4];
       91 
       92         byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0;
       93 
       94         int encodedIndex = 0;
       95         int dataIndex = 0;
       96         if (fDebug) {
       97             System.out.println("number of triplets = " + numberTriplets);
       98         }
       99 
      100         for (int i = 0; i < numberTriplets; i++) {
      101             b1 = binaryData[dataIndex++];
      102             b2 = binaryData[dataIndex++];
      103             b3 = binaryData[dataIndex++];
      104 
      105             if (fDebug) {
      106                 System.out.println("b1= " + b1 + ", b2= " + b2 + ", b3= " + b3);
      107             }
      108 
      109             l = (byte) (b2 & 0x0f);
      110             k = (byte) (b1 & 0x03);
      111 
      112             byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
      113             byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);
      114             byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc);
      115 
      116             if (fDebug) {
      117                 System.out.println("val2 = " + val2);
      118                 System.out.println("k4   = " + (k << 4));
      119                 System.out.println("vak  = " + (val2 | (k << 4)));
      120             }
      121 
      122             encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
      123             encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];
      124             encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3];
      125             encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f];
      126         }
      127 
      128         // form integral number of 6-bit groups  
      129         if (fewerThan24bits == EIGHTBIT) {
      130             b1 = binaryData[dataIndex];
      131             k = (byte) (b1 & 0x03);
      132             if (fDebug) {
      133                 System.out.println("b1=" + b1);
      134                 System.out.println("b1<<2 = " + (b1 >> 2));
      135             }
      136             byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
      137             encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
      138             encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4];
      139             encodedData[encodedIndex++] = PAD;
      140             encodedData[encodedIndex++] = PAD;
      141         } else if (fewerThan24bits == SIXTEENBIT) {
      142             b1 = binaryData[dataIndex];
      143             b2 = binaryData[dataIndex + 1];
      144             l = (byte) (b2 & 0x0f);
      145             k = (byte) (b1 & 0x03);
      146 
      147             byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
      148             byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);
      149 
      150             encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
      151             encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];
      152             encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2];
      153             encodedData[encodedIndex++] = PAD;
      154         }
      155         return new String(encodedData);
      156     }
      157 
      158     /**
      159      * base64 解碼
      160      *
      161      * @param str
      162      * @return
      163      */
      164     public static String decoder(String str) {
      165         final Base64.Decoder decoder = Base64.getDecoder();
      166         String strEncoder = null;
      167         try {
      168             strEncoder = new String(decoder.decode(str), "UTF-8");
      169         } catch (UnsupportedEncodingException e) {
      170             e.printStackTrace();
      171         }
      172         return strEncoder;
      173     }
      174 
      175 }

      運行實例:

       

      {
      image=  //圖片
      data:image/png;base64,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
      , code=  //驗證碼
      P3V44
      }

      復制image結果到瀏覽器:

       

      posted on 2020-03-15 18:31  夏目co  閱讀(1078)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 日韩激情一区二区三区| 99国产精品自在自在久久| 久久精品国产亚洲AV麻豆长发| 极品少妇无套内射视频| 亚洲一区精品视频在线 | 看免费的无码区特aa毛片| AV老司机色爱区综合| 午夜福利精品国产二区| 国产精品久久国产丁香花| 一本久久a久久精品综合| 久在线精品视频线观看| 亚洲精品动漫免费二区| 遂川县| 亚洲成年av天堂动漫网站| 国产69精品久久久久人妻刘玥| 国产99久久精品一区二区| 亚洲中文字幕日产无码成人片| 国产盗摄xxxx视频xxxx| 99国产精品自在自在久久| 国产色婷婷精品综合在线| 久久久亚洲欧洲日产国码αv| 黄色网站免费在线观看| 国产一区二区不卡在线| 欧美另类精品xxxx人妖| 民勤县| 午夜免费啪视频| 少妇被多人c夜夜爽爽av| 精品无码成人久久久久久| 亚洲中文精品一区二区| 欧美午夜精品久久久久久浪潮| 人人澡超碰碰97碰碰碰| 日本中文字幕不卡在线一区二区| 久久久久中文伊人久久久| 国内精品久久久久久久coent| 97欧美精品系列一区二区| 福利一区二区1000| 国产精品午夜福利小视频| 美女一区二区三区在线观看视频 | 久99久热只有精品国产99| 无码AV无码免费一区二区| 国产精品一线二线三线区|