package servlet;
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();
}
public static void main(String[] a){
System.out.println("aaa");
}
}
//--------------------------------------------------------------------------------------------
//------------页面代码--------------------------------------------------------------------
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>ampie</title>
<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('ExportImage');
}
}
</script>
</head>
<body>
<!-- saved from url=(0013)about:internet -->
<!-- ampie script-->
<script type="text/javascript" src="../ampie/swfobject.js"></script>
<div id="flashcontent">
<strong>You need to upgrade your Flash Player</strong>
</div>
<script type="text/javascript">
// <![CDATA[
var so = new SWFObject("../ampie/ampie.swf", "ampie", "100%", "100%", "8", "#000000");
so.addVariable("path", "../ampie/");
so.addVariable("settings_file", escape("ampie/ampie3/ampie_settings.xml"));
so.addVariable("data_file", escape("ampie/ampie3/ampie_data.xml"));
so.addVariable("preloader_color", "#ffffff");
so.write("flashcontent");
// ]]>
</script>
<!-- end of ampie script -->
<hr noshade size="1">
<input type="button" value="导出图片" onclick="exportImage();" />
</body>
</html>