`
wcy981123
  • 浏览: 1736 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

java生成透明图片

    博客分类:
  • 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

 

 

 

分享到:
评论

相关推荐

    java 生成水印图片

    Java 生成水印图片技术详解 Java 生成水印图片是指在 Java 程序中将水印图片添加到目标图片上的一种技术。水印图片是指在图片上添加的一种透明的图片,以达到保护图片的所有权和确认图片的来源。 在 Java 中,生成...

    java后台生成背景透明的验证码

    java后台生成背景色透明验证码的方法,可直接调用。本方法只生成随机字符数字组成的四位验证码。

    java swing创建透明图片

    网上很多关于Java创建透明图片的例子,但我试过之后都不好使。这个短短几行代码,就可以实现,只是一个方法,直接调用就可以。

    java动态生成图片 并把当前时间写在图片上

    Java动态生成图片并把当前时间写在图片上是一项常见的需求,比如用于生成验证码、日志记录或者自定义的报告。这个任务涉及到Java图形处理、日期时间处理以及IO操作等多个方面。下面将详细介绍如何实现这个功能。 ...

    java生成水印图片

    在Java编程语言中,生成带有水印的图片是一项常见的任务,尤其在版权保护、品牌标识或者数据可视化等领域。本文将详细讲解如何利用Java实现这一功能,包括如何动态设置水印的文字大小、颜色以及水印的倾斜角度。 ...

    Java半透明图片实现的步骤及源代码

    Java半透明图片实现的步骤及源代码

    java生成图片的验证码工具类及其使用

    java生成验证码的工具类,这个现在有依赖可以直接引入调用,但这个工具类没有引入依赖,大家也容易看懂代码,理解其含义。也可直接去工具类中调整生成验证码的宽度、高度、颜色、背景颜色、生成的随机数数量、干扰线...

    javapng透明图片缩略

    在Java编程中,生成PNG透明图片的缩略图是一项常见的任务,特别是在开发图形用户界面、网站或移动应用时。PNG格式因其支持透明度而受到欢迎,但缩略图的生成需要考虑保持图像质量和透明效果。以下是一些关于如何在...

    java生成GIF图片

    在Java编程环境中,生成GIF动态图是一项常见的需求,尤其在网页设计、数据可视化或社交媒体应用中。要实现这一功能,我们需要了解Java中处理图像的相关API以及如何利用它们来创建GIF动画。以下是一些核心知识点: 1...

    Java处理PNG透明性总结的几种方法,好用

    Java处理PNG透明性总结的几种方法,好用Java处理PNG透明性总结的几种方法,好用Java处理PNG透明性总结的几种方法,好用Java处理PNG透明性总结的几种方法,好用Java处理PNG透明性总结的几种方法,好...

    Java生成图片验证码工具类源码

    源码提供了一个生成图片验证码的工具类,适用于各种需要验证码的场景,如用户注册、...生成的验证码图片背景透明,线条清晰,可轻松辨认。本源码包含了工具类源码及调用示例,可供开发者参考使用,集成到您的项目中。

    java多张图片重叠。包括透明图片

    本示例探讨了如何将多张图片重叠在一起,包括处理透明度,特别是PNG等支持透明度的图像格式。这是一个关键的图像处理技术,因为可以创建复杂的视觉效果或者进行图像合成。 首先,我们需要引入Java的`javax.imageio`...

    java生成pdf工具类

    例如,一个简单的Java生成PDF工具类可能包含以下方法: ```java public class PdfGenerator { public void generatePdf(String dest, List&lt;String&gt; contentList) { // 初始化PDF文档和页面 PdfDocument pdfDoc =...

    java生成微信小程序分享图海报图的全过程 可作为util直接使用

    总结,通过以上步骤,我们可以使用Java实现一个功能完备的小程序海报图和分享图生成工具,它能够处理各种图像元素,进行精确的布局和文字排版,同时解决PNG图像的透明度问题,确保在微信小程序环境中呈现出高质量的...

    Java 生成pdf文件加盖公章图片,上传阿里云

    以上就是使用Java生成PDF文件并加盖公章图片,以及上传阿里云的基本步骤和涉及的关键技术点。实际开发中可能还需要根据具体需求进行调整,例如,公章的透明度、旋转角度等,都需要通过代码进行精确控制。

    java 指定url地址生成二维码(去白边、添加水印、添加logo(圆形/方形))

    在Java开发中,生成二维码是一项常见的任务,尤其在移动互联网应用中。本教程将详细介绍如何在Java中指定URL地址生成二维码,并实现去白边、添加水印以及添加圆形或方形的Logo功能。以下是一个详尽的步骤说明: 1. ...

    java操作wordpdf图片生成图片水印

    本篇将详细介绍如何使用Java来操作Word和PDF文档,并在其中的图片上生成水印。 首先,我们关注的是Java对Word文档的操作。Apache POI是一个非常流行的Java库,用于读写Microsoft Office格式的文件,包括Word(.docx...

    java生成pdf文件分页输出并添加水印

    在Java开发中,生成PDF文件是一项常见的需求,特别是在报表、文档和证书的生成场景中。Itext库是一个广泛使用的开源库,它允许开发者通过简单的API来创建和编辑PDF文档。本篇文章将深入探讨如何利用Itext库在Java中...

    java 后台 生成的表格通过HtmlImageGenerator(Html2Image) 生成图片

    Java 后台生成的表格通常用于数据展示,但有时我们需要将这些动态生成的表格转换为图片格式,以便于分享、打印或保存。这就涉及到一个工具——HtmlImageGenerator,也称为Html2Image。这个工具能够将HTML页面转化为...

Global site tag (gtag.js) - Google Analytics