【Servlet】Javaweb中文字转图片

来源:互联网 发布:java中的restfull接口 编辑:程序博客网 时间:2024/05/17 04:50

本文是《【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自己搞个序列号,以免警告@Overrideprotected 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()输出。

0 0
原创粉丝点击