java將圖片轉為base64返回給前端
阿新 • • 發佈:2020-02-16
本文例項為大家分享了java將圖片轉為base64返回給前端的具體程式碼,供大家參考,具體內容如下
一、controller端程式碼
@RequestMapping(value = "/captcha") public void imagecode(HttpServletRequest request,HttpServletResponse response) throws Exception { JSONObject object = new JSONObject(); CaptchaGenerator vcg = new CaptchaGenerator(); String vcode = vcg.generatorVCode(); BufferedImage vcodeImage = vcg.generatorVCodeImage(vcode,true); response.setDateHeader("Expires",0); response.setHeader("Cache-Control","no-store,no-cache,must-revalidate"); response.addHeader("Cache-Control","post-check=0,pre-check=0"); response.setHeader("Pragma","no-cache"); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); response.addHeader("code",vcode.toLowerCase()); try { ImageIO.write(vcodeImage,"png",outputStream); BASE64Encoder encoder = new BASE64Encoder(); String base64 = encoder.encodeBuffer(outputStream.toByteArray()).trim(); base64 = base64.replaceAll("\n","").replaceAll("\r",""); object.put("code","data:image/jpg;base64," + base64); response.getWriter().write(object.toString()); } catch (IOException e) { response.getWriter().write(""); } finally { if (outputStream != null) { outputStream.flush(); outputStream.close(); response.getWriter().close(); } } }
二、生成驗證碼的程式碼
(從某部落格拷過來直接用的)
package com.kinth.security.web.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.util.Random; /** * 驗證碼生成器 * * */ public class CaptchaGenerator { /** * 驗證碼來源 */ final private char[] code = { '2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','m','n','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z' }; /** * 字型 */ final private String[] fontNames = new String[]{ "黑體","宋體","Courier","Arial","Verdana","Times","Tahoma","Georgia"}; /** * 字型樣式 */ final private int[] fontStyles = new int[]{ Font.BOLD,Font.ITALIC|Font.BOLD }; /** * 驗證碼長度 * 預設4個字元 */ private int vcodeLen = 4; /** * 驗證碼圖片字型大小 * 預設17 */ private int fontsize = 21; /** * 驗證碼圖片寬度 */ private int width = (fontsize+1)*vcodeLen+10; /** * 驗證碼圖片高度 */ private int height = fontsize+12; /** * 干擾線條數 * 預設3條 */ private int disturbline = 3; public CaptchaGenerator(){} /** * 指定驗證碼長度 * @param vcodeLen 驗證碼長度 */ public CaptchaGenerator(int vcodeLen) { this.vcodeLen = vcodeLen; this.width = (fontsize+1)*vcodeLen+10; } /** * 生成驗證碼圖片 * @param vcode 要畫的驗證碼 * @param drawline 是否畫干擾線 * @return */ public BufferedImage generatorVCodeImage(String vcode,boolean drawline){ //建立驗證碼圖片 BufferedImage vcodeImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); Graphics g = vcodeImage.getGraphics(); //填充背景色 g.setColor(new Color(246,240,250)); g.fillRect(0,width,height); if(drawline){ drawDisturbLine(g); } //用於生成偽隨機數 Random ran = new Random(); //在圖片上畫驗證碼 for(int i = 0;i < vcode.length();i++){ //設定字型 g.setFont(new Font(fontNames[ran.nextInt(fontNames.length)],fontStyles[ran.nextInt(fontStyles.length)],fontsize)); //隨機生成顏色 g.setColor(getRandomColor()); //畫驗證碼 g.drawString(vcode.charAt(i)+"",i*fontsize+10,fontsize+5); } //釋放此圖形的上下文以及它使用的所有系統資源 g.dispose(); return vcodeImage; } /** * 獲得旋轉字型的驗證碼圖片 * @param vcode * @param drawline 是否畫干擾線 * @return */ public BufferedImage generatorRotateVCodeImage(String vcode,boolean drawline){ //建立驗證碼圖片 BufferedImage rotateVcodeImage = new BufferedImage(width,BufferedImage.TYPE_INT_RGB); Graphics2D g2d = rotateVcodeImage.createGraphics(); //填充背景色 g2d.setColor(new Color(246,250)); g2d.fillRect(0,height); if(drawline){ drawDisturbLine(g2d); } //在圖片上畫驗證碼 for(int i = 0;i < vcode.length();i++){ BufferedImage rotateImage = getRotateImage(vcode.charAt(i)); g2d.drawImage(rotateImage,null,(int) (this.height * 0.7) * i,0); } g2d.dispose(); return rotateVcodeImage; } /** * 生成驗證碼 * @return 驗證碼 */ public String generatorVCode(){ int len = code.length; Random ran = new Random(); StringBuffer sb = new StringBuffer(); for(int i = 0;i < vcodeLen;i++){ int index = ran.nextInt(len); sb.append(code[index]); } return sb.toString(); } /** * 為驗證碼圖片畫一些干擾線 * @param g */ private void drawDisturbLine(Graphics g){ Random ran = new Random(); for(int i = 0;i < disturbline;i++){ int x1 = ran.nextInt(width); int y1 = ran.nextInt(height); int x2 = ran.nextInt(width); int y2 = ran.nextInt(height); g.setColor(getRandomColor()); //畫干擾線 g.drawLine(x1,y1,x2,y2); } } /** * 獲取一張旋轉的圖片 * @param c 要畫的字元 * @return */ private BufferedImage getRotateImage(char c){ BufferedImage rotateImage = new BufferedImage(height,BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = rotateImage.createGraphics(); //設定透明度為0 g2d.setColor(new Color(255,255,0)); g2d.fillRect(0,height); Random ran = new Random(); g2d.setFont(new Font(fontNames[ran.nextInt(fontNames.length)],fontsize)); g2d.setColor(getRandomColor()); double theta = getTheta(); //旋轉圖片 g2d.rotate(theta,height/2,height/2); g2d.drawString(Character.toString(c),(height-fontsize)/2,fontsize+5); g2d.dispose(); return rotateImage; } /** * @return 返回一個隨機顏色 */ private Color getRandomColor(){ Random ran = new Random(); return new Color(ran.nextInt(220),ran.nextInt(220),ran.nextInt(220)); } /** * @return 角度 */ private double getTheta(){ return ((int) (Math.random()*1000) % 2 == 0 ? -1 : 1)*Math.random(); } /** * @return 驗證碼字元個數 */ public int getVcodeLen() { return vcodeLen; } /** * 設定驗證碼字元個數 * @param vcodeLen */ public void setVcodeLen(int vcodeLen) { this.width = (fontsize+3)*vcodeLen+10; this.vcodeLen = vcodeLen; } /** * @return 字型大小 */ public int getFontsize() { return fontsize; } /** * 設定字型大小 * @param fontsize */ public void setFontsize(int fontsize) { this.width = (fontsize+3)*vcodeLen+10; this.height = fontsize+15; this.fontsize = fontsize; } /** * @return 圖片寬度 */ public int getWidth() { return width; } /** * 設定圖片寬度 * @param width */ public void setWidth(int width) { this.width = width; } /** * @return 圖片高度 */ public int getHeight() { return height; } /** * 設定圖片高度 * @param height */ public void setHeight(int height) { this.height = height; } /** * @return 干擾線條數 */ public int getDisturbline() { return disturbline; } /** * 設定干擾線條數 * @param disturbline */ public void setDisturbline(int disturbline) { this.disturbline = disturbline; } }
三、前端顯示
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html> <html> <head> <meta charset="ISO-8859-1"> <title>Insert title here</title> <script src="../static/model/js/jquery-1.11.2.min.js"></script> </head> <body> <img id="randomImage" src="" /> <script type="text/javascript"> $(function() { refreshimg(); }) function refreshimg() { $.ajax({ type : "POST",dataType : "json",url : "../article/captcha",success : function(data) { console.log('base64=' + data.codePic); $('#randomImage').attr('src',data.code); },error : function() { } }); $("#randomImage").click(refreshimg) } </script> </body> </html>
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。