源数据:
<?xml version="1.0" encoding="UTF-8"?> <pie> <slice title="中国" pull_out="true">27</slice> <slice title="美国" pull_out="false" alpha="80">16</slice> <slice title="德国" pull_out="false">8</slice> <slice title="韩国" pull_out="false">7</slice> <slice title="意大利" alpha="100">6</slice> </pie>
前台
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>2008年第29届北京奥运会金牌榜</title> <script type="text/javascript" src="ampie/swfobject.js"></script> <script type="text/javascript"> function exportImage() { var flashMovie = document.getElementById('ampie'); if (flashMovie) { flashMovie.exportImage('servlet/ExportImage'); } } </script> </head> <body> <div id="flashcontent"> <strong>You need to upgrade your Flash Player</strong> </div> <script type="text/javascript"> var so = new SWFObject("ampie/ampie.swf", "ampie", "400", "200", "8", "#FFFFFF"); so.addVariable("path", "ampie/"); so.addVariable("settings_file", escape("ampie/ampie_settings.xml")); so.addVariable("data_file", escape("ampie/ampie_data.xml")); so.addVariable("preloader_color", "#999999"); so.write("flashcontent"); </script> <hr noshade size="1"> <input type="button" value="导出图片" onclick="exportImage();" /> </body> </html>
后台:
package org.lhq.ampie.demo; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io.IOException; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGEncodeParam; import com.sun.image.codec.jpeg.JPEGImageEncoder; /** * 这个Servlet处理图表页面传来的导出图片请求 * * @author 廖瀚卿 * */ @SuppressWarnings("serial") public class ExportImage extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 页面flash的宽度和高度 int width = Integer.parseInt(request.getParameter("width")); int height = Integer.parseInt(request.getParameter("height")); BufferedImage result = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 页面是将一个个像素作为参数传递进来的,所以如果图表越大,处理时间越长 for (int y = 0; y < height; y++) { int x = 0; String[] row = request.getParameter("r" + y).split(","); for (int c = 0; c < row.length; c++) { String[] pixel = row[c].split(":"); // 十六进制颜色数组 int repeat = pixel.length > 1 ? Integer.parseInt(pixel[1]) : 1; for (int l = 0; l < repeat; l++) { result.setRGB(x, y, Integer.parseInt(pixel[0], 16)); x++; } } } response.setContentType("image/jpeg"); response.addHeader("Content-Disposition", "attachment; filename=\"amchart.jpg\""); Graphics2D g = result.createGraphics(); // 处理图形平滑度 g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.drawImage(result, 0, 0, width, height, null); g.dispose(); ServletOutputStream f = response.getOutputStream(); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(f); JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(result); param.setQuality((float) (100 / 100.0), true);// 设置图片质量,100最大,默认70 encoder.encode(result, param); ImageIO.write(result, "JPEG", response.getOutputStream());// 输出图片 f.close(); } }