本文是《【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()输出。