【Servlet】Javaweb中文字转图片

本文是《【php】文字转图片》(点击打开链接)在Javaweb的实现。主要还是应对一些网络爬虫对电话号码与邮箱的抓取,同时禁止用户随意复制内容之类的。当然,被转换的文字主要还是数字与英文,中文的转化会乱码。

具体是如下效果:


不影响视觉效果,但是12345678是一张图片。

这一页index.jsp也因此是如此简单:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文字转图片</title>
</head>
<body>
	<p>
		电话号码:<img src="./create_image_by_text?font_size=12&text=12345678"
			style="vertical-align: middle;" />
	</p>
</body>
</html>

img标签的src属性同样引用后台文字转图片名为create_image_by_text的Servlet就可以了。

这里create_image_by_text运用到Servlet3.0的注释,因此web.xml如下,无须写任何东西:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	version="3.0">
</web-app>

整个工程目录结构图很简单了,核心都在于create_image_by_text这个Servlet:


create_image_by_text.java的代码如下:

package text_image;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.font.FontRenderContext;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "create_image_by_text", urlPatterns = { "/create_image_by_text" })
public class create_image_by_text extends HttpServlet {

	private static final long serialVersionUID = 9170360393931265363L;// 让Eclipse自己搞个序列号,以免警告

	@Override
	protected void service(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// 根据前台传过来的2个参数
		int font_size = Integer.parseInt(request.getParameter("font_size"));// 一个字体大小
		String str = request.getParameter("text");// 一个准备转化为图片的内容

		Font font = new Font("Arial", Font.BOLD, font_size);// 新建字体

		// 这一段是求出整个要转化为图片的内容之像素大小
		Rectangle2D r = font.getStringBounds(str, new FontRenderContext(
				AffineTransform.getScaleInstance(1, 1), false, false));// 根据字体大小新建矩形
		int unitHeight = (int) Math.floor(r.getHeight());// 获取单个字符的高度
		// 获取整个str用了font样式的宽度这里用四舍五入后+1保证宽度绝对能容纳这个字符串作为图片的宽度
		int width = (int) Math.round(r.getWidth()) + 1;
		int height = unitHeight + 3;// 把单个字符的高度+3保证高度绝对能容纳字符串作为图片的高度

		// 这里是画图
		BufferedImage image = new BufferedImage(width, height,
				BufferedImage.TYPE_INT_BGR);// 创建图片,也就是创建一张画纸
		Graphics graphics = image.getGraphics();// 创建画笔
		graphics.setColor(Color.WHITE);// 设置画笔为白色
		graphics.fillRect(0, 0, width, height);// 先用白色填充整张图片,也就是背景
		graphics.setColor(Color.black);// 在换成黑色
		graphics.setFont(font);// 设置画笔字体
		graphics.drawString(str, 0, font.getSize());// 画出字符串
		graphics.dispose();// 画完回收画笔

		ImageIO.write(image, "gif", response.getOutputStream());// 输出gif图片
	}

}

从后台收到两个参数,一个字体大小,一个要转化为图片的内容。

之后设定字体为Arial,这里,只能使用Java本身支持的字体,不然可能会产生什么为只错误。所谓的Java本身支持的字体,也就是网页本来就自带的 宋体、黑体、仿宋GB2312、Arial、Times New Roman等,这里使用比较好看又大量兼容的Arial字体。

然后,根据字体的大小求出图片的尺寸。

最后利用Java的画图类,搞张画纸BufferedImage,搞支画笔Graphics,画完使用response.getOutputStream()输出。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值