package cn.newgxu.bbs.web.servlet; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import cn.newgxu.bbs.common.Constants; import cn.newgxu.bbs.common.util.Util; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder; /** * * @author polly * @since 4.0.0 * @version $Revision 1.1$ */ public class ValidImageServlet extends BaseServlet { private static final long serialVersionUID = 5146905313018020357L; private static final Log log = LogFactory.getLog(ValidImageServlet.class); public void service( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String validCode = Util.getRandomString(); Util.saveValidCode(request.getSession(), validCode); response(response, getBufferedImage(validCode)); } /** * 给定范围获得随机颜色 * * @param fc * @param bc * @return */ public Color getRandColor(int fc, int bc) { Random random = new Random(); fc = fc > 255 ? 255 : fc; bc = bc > 255 ? 255 : bc; int r = fc + random.nextInt(bc - fc); int g = fc + random.nextInt(bc - fc); int b = fc + random.nextInt(bc - fc); return new Color(r, g, b); } /** * 通过文件创建图像 格式为jpg类型 * * @param fileName * @param content */ public void creatImage(String fileName, String content) { try { File f = new File(fileName); if (!f.exists()) { f.createNewFile(); } else { Thread.sleep(200); f.delete(); f.createNewFile(); } ImageIO.write(getBufferedImage(content), "jpg", f); } catch (Exception e) { log.warn(e); } } /** * 创建图像 格式为jpg类型 * * @param content - String 图片输出内容 * @return java.awt.image.BufferedImage * @since 2005-7-19 */ public BufferedImage getBufferedImage(String content) { return getBufferedImage(content, 40, Constants.RANDOM_STRING_HEIGHT); } /** * 创建图像 格式为jpg类型 * * @param content - String 图片输出内容 * @param width - int 图片宽度 * @param height - int 图片高度 * @return java.awt.image.BufferedImage */ public BufferedImage getBufferedImage(String content, int width, int height) { // 在内存中创建图象 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 获取图形上下文 Graphics2D g = image.createGraphics(); // 设定背景色 g.setColor(getRandColor(200, 250)); g.fillRect(0, 0, width, height); // 设定字体 g.setFont(new Font("Times New Roman", Font.PLAIN, 14)); // g.setFont(new Font("宋体", Font.PLAIN, 18)); g.setColor(Color.black);// 黑色文字 g.drawString(content, 3, 13); g.dispose(); return image; } /** * 将现有BufferedImage融合进Response * * @param response - javax.servlet.http.ServletResponse 将使用的response对象 * @param img - java.awt.image.BufferedImage */ public void response(HttpServletResponse response, BufferedImage img) { try { response.setContentType("image/jpeg");// 设定输出的类型 response.setHeader("Cache-Control", "no-cache"); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response.getOutputStream()); encoder.encode(img);// 对图片进行输出编码 } catch (Exception e) { log.warn(e); } } /** * 测试 */ public static void main(String[] args) throws Exception { ValidImageServlet c = new ValidImageServlet(); c.creatImage("H:/Downloads/temp/1.jpg", Util.getRandomString()); } }