java生成透明图片

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字体脚本

http://pan.baidu.com/s/1wyxIT

 

 

 

猜你喜欢

转载自wcy981123.iteye.com/blog/1960327