package com.zbj.nj.controller; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.Toolkit; import java.awt.Transparency; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.util.HashMap; import java.util.Map; import java.util.StringTokenizer; import javax.imageio.ImageIO; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; @Controller public class UploadController { /** * @return */ @RequestMapping("/getImage") public void getImage(HttpServletRequest request, HttpServletResponse response) throws Exception { // 设置头信息 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"); response.setContentType("image/jpeg"); ServletOutputStream out = response.getOutputStream(); // 创建透明的图片 this.getTransparencyImage(out, request); try { out.flush(); } finally { out.close(); } // } /** * 获取参数信息 * @param request * @return map 《包含fontFamily、style、fontSize、color、style[斜体、粗细]、text[完整的文本信息]》 */ public Map<String, String> getParameter(HttpServletRequest request){ // 获取创建图片的信息参数 Map<String, String> map = new HashMap<String, String>(); //这两条暂时为使用 暂时无法实现效果 map.put("layout", request.getParameter("layout"));// 布局? map.put("align", request.getParameter("align"));// 对齐 //有效数据 map.put("fontFamily", request.getParameter("fontFamily"));// 字体 √ map.put("fontSize", request.getParameter("fontSize"));// 字体大小√ map.put("color", request.getParameter("color"));// 字体颜色 √ map.put("text", request.getParameter("text"));// 文本信息 √ //获得字体颜色 rgb参数 int color = Integer.parseInt(request.getParameter("color")); String b = String.valueOf(color % 256); color /= 256; String g = String.valueOf(color % 256); color /= 256; String r = String.valueOf(color % 256); map.put("r", r); map.put("g", g); map.put("b", b); //设置字体样式 String bold = request.getParameter("bold").trim(); String italic = request.getParameter("italic").trim(); String style = String.valueOf(Font.PLAIN);//默认字体 if ("" != bold && "" != italic){ style = String.valueOf(Font.BOLD | Font.ITALIC);// 粗体&&斜体 √ }else if("" != bold){//粗体 √ style = String.valueOf(Font.BOLD); }else if("" != italic){ style = String.valueOf(Font.ITALIC);// 斜体 √ } map.put("style", style); return map ; } /** * 创建透明的图片 * * @param out * @throws IOException */ public void getTransparencyImage(OutputStream out, HttpServletRequest request) throws IOException { //获取数据处理 Map<String, String> map = this.getParameter(request); String fontFamily = map.get("fontFamily"); int fontSize = Integer.parseInt(map.get("fontSize")); String text = map.get("text"); //初始化基本数据 int width = 1, height = 1, ascent = 1, line = 1; //获得正确的text的width, height Map<String, Object> resultMap = this.getTextInfo( map, width, height); line = Integer.parseInt(resultMap.get("line").toString()); width = Integer.parseInt(resultMap.get("width").toString()); height = (int)Double.parseDouble(resultMap.get("height").toString());//每一行的高度 ascent = Integer.parseInt(resultMap.get("ascent").toString()); // 创建BufferedImage对象 BufferedImage image = new BufferedImage(width, (height+ascent)*line, BufferedImage.TYPE_INT_ARGB); // 获取Graphics2D Graphics2D g2d = image.createGraphics(); // ---------- 增加下面的代码使得背景透明 ----------------- image = g2d.getDeviceConfiguration().createCompatibleImage(width, (height+ascent)*line); g2d.dispose(); g2d = image.createGraphics(); // ---------- 背景透明代码结束 ----------------- //抗锯齿 让图片看起来更清晰 RenderingHints rh = g2d.getRenderingHints(); rh.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setRenderingHints(rh); // 画图 Start //获得字体颜色 int r = Integer.parseInt(map.get("r")), g = Integer.parseInt(map.get("g")), b = Integer.parseInt(map.get("b")) ; int style = Integer.parseInt(map.get("style")); // 设置字体 名称、样式、磅值大小(同时使用斜体和粗体) Font font = new Font(fontFamily, style, fontSize); g2d.setFont(font); // 设置字体颜色 g2d.setColor(new Color(r, g, b)); StringTokenizer st = new StringTokenizer(text, "\r\n"); int i = 0; while (st.hasMoreTokens()) { i++; // str 显示的文字, x 文字距离左边的间距, y 文字距离上面的间距 和字体一样 g2d.drawString(st.nextToken(), 0, (height+ascent) * i); } // 画图 End // 释放对象 g2d.dispose(); // 输出文件 ImageIO.write(image, "png", out); // 保存文件 ImageIO.write(image, "PNG", new File("F:/temp.png")); } /** * 获取Text对应的信息 * @param map 《包含fontFamily、style、fontSize、color、style[斜体、粗细]、text[完整的文本信息]》 * @param width 宽度 默认为1 * @param height 高度 默认为1 * @return */ public Map<String, Object> getTextInfo(Map<String, String> map, int width, int height){ int fontSize = Integer.parseInt(map.get("fontSize")); String fontFamily = map.get("fontFamily"); BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = image.createGraphics(); Font font = new Font(fontFamily, Integer.parseInt(map.get("style")), fontSize); FontMetrics mets = g2d.getFontMetrics(font); int ascent = mets.getLeading();//FontMetrics对象所描述的Font的标准行间距 double heightInPixels = mets.getHeight();// 文字行高 int line = 0;//text行数 int textWidth = 0;//文本最宽的width int tempWidth =0 ;//临时存储当前行文本Width StringTokenizer st = new StringTokenizer(map.get("text"), "\r\n"); while (st.hasMoreTokens()) { line++; String printText = st.nextToken(); //判断字符宽度, 保存最宽的字符的宽度 Rectangle2D rec = this.getRectangle2D(map, printText); tempWidth = (int)rec.getWidth(); if(textWidth < tempWidth){ textWidth = tempWidth; } // str 显示的文字, x 文字距离左边的间距, y 文字距离上面的间距 和字体一样 g2d.drawString(printText, 0, fontSize * line); } // 释放对象 g2d.dispose(); Map<String, Object> resultMap = new HashMap<String, Object>(); resultMap.put("width", textWidth); resultMap.put("height", heightInPixels); resultMap.put("ascent", ascent); resultMap.put("line", line); return resultMap ; } /** * 获取 Rectangle2D 对象 * @param map 《包含fontFamily、style、fontSize、color、style[斜体、粗细]、text[完整的文本信息]》 * @param printText 文本信息 * @return <code>new Rectangle2D();</code> */ public Rectangle2D getRectangle2D(Map<String, String> map, String printText){ BufferedImage image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = image.createGraphics(); Font font = new Font(map.get("fontFamily"), Integer.parseInt(map.get("style")), Integer.parseInt(map.get("fontSize"))); FontMetrics mets = g2d.getFontMetrics(font); Rectangle2D bounds = mets.getStringBounds(printText, null); return bounds ; } }
/** * 返回一个字体列表的XML * @param request * @param response * @throws Exception */ @RequestMapping("/getFontXml.do") public void getxml(HttpServletRequest request, HttpServletResponse response)throws Exception{ //设置头信息 response.setContentType("text/xml;charset=UTF-8"); response.setCharacterEncoding("UTF-8"); Document documentXml = DocumentHelper.createDocument(); Element rootElement = documentXml.addElement("date"); Element element1 = rootElement.addElement("font"); element1.addAttribute("id", "jmdgz"); element1.addAttribute("name", "金梅淡古字"); Element element2 = rootElement.addElement("font"); element2.addAttribute("id", "mnjdy"); element2.addAttribute("name", "迷你简黛玉体"); Element element3 = rootElement.addElement("font"); element3.addAttribute("id", "msyh"); element3.addAttribute("name", "微软雅黑"); Element element4 = rootElement.addElement("font"); element4.addAttribute("id", "hkcdt"); element4.addAttribute("name", "华康彩带体"); Element element5 = rootElement.addElement("font"); element5.addAttribute("id", "kt"); element5.addAttribute("name", "楷体"); Element element6 = rootElement.addElement("font"); element6.addAttribute("id", "st"); element6.addAttribute("name", "宋体"); Element element7 = rootElement.addElement("font"); element7.addAttribute("id", "ht"); element7.addAttribute("name", "黑体"); Element element8 = rootElement.addElement("font"); element8.addAttribute("id", "arial"); element8.addAttribute("name", "Arial"); Element element9 = rootElement.addElement("font"); element9.addAttribute("id", "timesnewroman"); element9.addAttribute("name", "Times New Roman"); Element element10 = rootElement.addElement("font"); element10.addAttribute("id", "vrinda"); element10.addAttribute("name", "Vrinda"); //系统默认字体 // GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); // String[] styleArrays = ge.getAvailableFontFamilyNames(); // for (int i = 0; i < styleArrays.length; i++) { // Element element = rootElement.addElement("font"); // element.addAttribute("id", "zy"); // element.addAttribute("name", styleArrays[i]); // } response.getWriter().print(documentXml.asXML()); response.getWriter().close(); }
jap代码:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> This is my JSP page. <br><%=basePath%> <hr> <form action="<%=basePath%>getImage.do" method="post"> <p>斜体italic<input id="italic" name="italic" type="text" value="0"></p> <p>布局layout<input id="layout" name="layout" type="text" value="0"></p> <p>对齐align<input id="align" name="align" type="text" value="0"></p> <p>字体font-family<input id="fontFamily" name="fontFamily" type="text" value="隶书"></p> <p>字体大小fontSize<input id="fontSize" name="fontSize" type="text" value="24"></p> <p>颜色color<input id="color" name="color" type="text" value="16711680"></p> <p>粗细bold<input id="bold" name="bold" type="text" value="0"></p> <p>文本text<textarea id="text" cols="20" name="text" style="height: 100px; width: 600px;">text</textarea></p> <p><input id="Submit1" type="submit" value="submit"></p> </form> </body> </html>
文中使用的.ttf文件, 自行下载!
或者,下载百度网盘的完整代码, 附带.ttf字体脚本