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字体脚本
相关推荐
Java 生成水印图片技术详解 Java 生成水印图片是指在 Java 程序中将水印图片添加到目标图片上的一种技术。水印图片是指在图片上添加的一种透明的图片,以达到保护图片的所有权和确认图片的来源。 在 Java 中,生成...
java后台生成背景色透明验证码的方法,可直接调用。本方法只生成随机字符数字组成的四位验证码。
网上很多关于Java创建透明图片的例子,但我试过之后都不好使。这个短短几行代码,就可以实现,只是一个方法,直接调用就可以。
Java动态生成图片并把当前时间写在图片上是一项常见的需求,比如用于生成验证码、日志记录或者自定义的报告。这个任务涉及到Java图形处理、日期时间处理以及IO操作等多个方面。下面将详细介绍如何实现这个功能。 ...
在Java编程语言中,生成带有水印的图片是一项常见的任务,尤其在版权保护、品牌标识或者数据可视化等领域。本文将详细讲解如何利用Java实现这一功能,包括如何动态设置水印的文字大小、颜色以及水印的倾斜角度。 ...
Java半透明图片实现的步骤及源代码
java生成验证码的工具类,这个现在有依赖可以直接引入调用,但这个工具类没有引入依赖,大家也容易看懂代码,理解其含义。也可直接去工具类中调整生成验证码的宽度、高度、颜色、背景颜色、生成的随机数数量、干扰线...
在Java编程中,生成PNG透明图片的缩略图是一项常见的任务,特别是在开发图形用户界面、网站或移动应用时。PNG格式因其支持透明度而受到欢迎,但缩略图的生成需要考虑保持图像质量和透明效果。以下是一些关于如何在...
在Java编程环境中,生成GIF动态图是一项常见的需求,尤其在网页设计、数据可视化或社交媒体应用中。要实现这一功能,我们需要了解Java中处理图像的相关API以及如何利用它们来创建GIF动画。以下是一些核心知识点: 1...
Java处理PNG透明性总结的几种方法,好用Java处理PNG透明性总结的几种方法,好用Java处理PNG透明性总结的几种方法,好用Java处理PNG透明性总结的几种方法,好用Java处理PNG透明性总结的几种方法,好...
源码提供了一个生成图片验证码的工具类,适用于各种需要验证码的场景,如用户注册、...生成的验证码图片背景透明,线条清晰,可轻松辨认。本源码包含了工具类源码及调用示例,可供开发者参考使用,集成到您的项目中。
本示例探讨了如何将多张图片重叠在一起,包括处理透明度,特别是PNG等支持透明度的图像格式。这是一个关键的图像处理技术,因为可以创建复杂的视觉效果或者进行图像合成。 首先,我们需要引入Java的`javax.imageio`...
例如,一个简单的Java生成PDF工具类可能包含以下方法: ```java public class PdfGenerator { public void generatePdf(String dest, List<String> contentList) { // 初始化PDF文档和页面 PdfDocument pdfDoc =...
总结,通过以上步骤,我们可以使用Java实现一个功能完备的小程序海报图和分享图生成工具,它能够处理各种图像元素,进行精确的布局和文字排版,同时解决PNG图像的透明度问题,确保在微信小程序环境中呈现出高质量的...
以上就是使用Java生成PDF文件并加盖公章图片,以及上传阿里云的基本步骤和涉及的关键技术点。实际开发中可能还需要根据具体需求进行调整,例如,公章的透明度、旋转角度等,都需要通过代码进行精确控制。
在Java开发中,生成二维码是一项常见的任务,尤其在移动互联网应用中。本教程将详细介绍如何在Java中指定URL地址生成二维码,并实现去白边、添加水印以及添加圆形或方形的Logo功能。以下是一个详尽的步骤说明: 1. ...
本篇将详细介绍如何使用Java来操作Word和PDF文档,并在其中的图片上生成水印。 首先,我们关注的是Java对Word文档的操作。Apache POI是一个非常流行的Java库,用于读写Microsoft Office格式的文件,包括Word(.docx...
在Java开发中,生成PDF文件是一项常见的需求,特别是在报表、文档和证书的生成场景中。Itext库是一个广泛使用的开源库,它允许开发者通过简单的API来创建和编辑PDF文档。本篇文章将深入探讨如何利用Itext库在Java中...
Java 后台生成的表格通常用于数据展示,但有时我们需要将这些动态生成的表格转换为图片格式,以便于分享、打印或保存。这就涉及到一个工具——HtmlImageGenerator,也称为Html2Image。这个工具能够将HTML页面转化为...