`
yourgame
  • 浏览: 356648 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

amCharts导出图片JAVA实现

阅读更多
amCharts 是基于Flash的一套图表解决方法,界面比JFreeChart华丽很多,而且可以与用户交互,动画效果非常漂亮.官网:http://www.amcharts.com

w_e_ibo:
http://t.cn/zjqEaRh  
http://weibo.com/liao27

About

AmCharts is a set of Flash charts for your websites and Web-based products. AmCharts can extract data from simple CSV or XML files, or they can read dynamic data generated with PHP, .NET, Java, Ruby on Rails, Perl, ColdFusion, and many other programming languages.
可见她很强大!

官网截图:


曲线图


柱状图


饼图

[img]http://yourgame.iteye.com/upload/picture/pic/20039/0fba1a10-9105-35bf-99c0-8ab1460e5ba6.gif [/img]
泡沫图


股票图


华丽的界面,非常的诱惑人,可是这个产品是要收费的,不过网上可以找到破解版本.
在官方的Demo很简单,大家可以下载来学习.不过我发现Demo中只有PHP,ASP.NET的导出图片示例,而没有JAVA导出图片的示例,我仿照ASP.NET的实现方法,做了一个JAVA导出的Demo!写得不怎么严谨,望大家多多指点


先看截图:

3D饼图


支持两种导出方式(设置很简单)


弹出保存对话框

[img]http://yourgame.iteye.com/upload/picture/pic/20047/472b70c3-06b8-3361-98ae-103b1111be89.gif [/img]
导出后的图片

图表的数据源:
<?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>


处理导出的Servlet:
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();
	}

}
  • ampie_export_images.rar (39.5 KB)
  • 描述: 源代码,包括amCharts的破解:),希望能提出宝贵的意见,相互学习
  • 下载次数: 1894
分享到:
评论
8 楼 ylc2010 2014-11-24  
楼主问你个问题,饼状图的标题你设置在setting的label里面,但是这个里面text值是个静态的,如果要根据不同图展示不同标题就无法实现了。

难道一个图一个setting文件吗?
7 楼 z121172495 2012-01-11  
谢谢LZ萃取 ~~
6 楼 qbq 2009-06-04  
请问这个能实现双Y轴么?

谢谢
5 楼 kjava 2009-01-12  
yourgame 写道
amCharts 是基于Flash的一套图表解决方法,界面比JFreeChart华丽很多,而且可以与用户交互,动画效果非常漂亮.官网:http://www.amcharts.com
About

AmCharts is a set of Flash charts for your websites and Web-based products. AmCharts can extract data from simple CSV or XML files, or they can read dynamic data generated with PHP, .NET, Java, Ruby on Rails, Perl, ColdFusion, and many other programming languages.
可见她很强大!

官网截图:

[img]http://yourgame.iteye.com/upload/picture/pic/20045/4987df21-a373-37f9-9963-e18f7e65b6a9.gif [/img]
曲线图

[img]http://yourgame.iteye.com/upload/picture/pic/20043/4ca7b27a-2595-3783-a42f-31479877ce81.gif [/img]
柱状图

[img]http://yourgame.iteye.com/upload/picture/pic/20041/31db4626-e2fe-33e7-b42c-866aa7dcc15c.gif [/img]
饼图

[img]http://yourgame.iteye.com/upload/picture/pic/20039/0fba1a10-9105-35bf-99c0-8ab1460e5ba6.gif [/img]
泡沫图

[img]http://yourgame.iteye.com/upload/picture/pic/20037/c42d3157-f296-322b-9693-0caf332bb06f.gif [/img]
股票图


华丽的界面,非常的诱惑人,可是这个产品是要收费的,不过网上可以找到破解版本.
在官方的Demo很简单,大家可以下载来学习.不过我发现Demo中只有PHP,ASP.NET的导出图片示例,而没有JAVA导出图片的示例,我仿照ASP.NET的实现方法,做了一个JAVA导出的Demo!写得不怎么严谨,望大家多多指点


先看截图:
[img]http://yourgame.iteye.com/upload/picture/pic/20053/da2c9334-0a98-3fff-b7c3-ac8d8b26f9fa.gif [/img]
3D饼图

[img]http://yourgame.iteye.com/upload/picture/pic/20051/0b118ae6-c0bd-3c6f-adde-ef940ac5e65f.gif [/img]
支持两种导出方式(设置很简单)

[img]http://yourgame.iteye.com/upload/picture/pic/20049/f47b6428-4d73-383d-a39a-82e3d3dea790.gif [/img]
弹出保存对话框

[img]http://yourgame.iteye.com/upload/picture/pic/20047/472b70c3-06b8-3361-98ae-103b1111be89.gif [/img]
导出后的图片


图表的数据源:
<?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>


处理导出的Servlet:
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();
	}

}

4 楼 cuibo110 2008-11-20  
楼主,我问个问题,不知道您遇到没有

您的这个导出图片的功能为什么放入iframe框架里面就不好用了呢,有JS错误,提示权限不够!

注:我已经破解了amcharts。

希望能给予解答,谢谢!
3 楼 yourgame 2008-11-12  
amcharts_key.txt
flash2u 写道

这个Flash图表 元件很棒啊 并不需要破解,只要准备一个版权文字档amcharts_key.txt放进去就是正式版了 这档案也很好取得,上Google搜索一下就有 http://lethargy.org/amcharts/amcolumn/amcharts_key.txt &nbsp; http://www.dragonsoft.net/projects/erning/browser/amcharts/dotnet/trunk/amCharts/Static/amcharts_key.txt?rev=88

下载包中已经包含了该文件。
2 楼 flash2u 2008-11-10  
这个Flash图表 元件很棒啊
并不需要破解,只要准备一个版权文字档amcharts_key.txt放进去就是正式版了

这档案也很好取得,上Google搜索一下就有

http://lethargy.org/amcharts/amcolumn/amcharts_key.txt
 
http://www.dragonsoft.net/projects/erning/browser/amcharts/dotnet/trunk/amCharts/Static/amcharts_key.txt?rev=88

1 楼 yiminghe 2008-09-14  
赞个  ,以前都用 jfreechart的 ,搞得 服务器端 生成一段temp file

试试这个了

相关推荐

    amcharts 图片导出格式解读

    总之,AmCharts的图片导出功能是通过前端和后端的协同工作来实现的,前端负责捕获用户操作和图表渲染,后端则处理数据转换和存储。`ChartImageExporter.java`作为后端的一部分,提供了将图表数据转化为可下载图片的...

    应聘Java工程师-3年工作经验-张xx-南昌大学-1----0_嵌入式_java简历_程序员简历模板_计算机相关专业.doc

    他负责了业务模块的设计、权限管理、待办任务管理,用SpringMail发送提醒邮件,Quartz框架实现定时任务,POI技术处理数据导出,Redis用于菜单智能展示,而统计分析则可能借助amCharts等工具实现动态图表。...

    避开10大常见坑:DeepSeekAPI集成中的错误处理与调试指南.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    前端分析-2023071100789

    前端分析-2023071100789

    基于kinect的3D人体建模C++完整代码.cpp

    基于kinect的3D人体建模C++完整代码.cpp

    搞机工具箱10.1.0.7z

    搞机工具箱10.1.0.7z

    GRU+informer时间序列预测(Python完整源码和数据)

    GRU+informer时间序列预测(Python完整源码和数据),python代码,pytorch架构,适合各种时间序列直接预测。 适合小白,注释清楚,都能看懂。功能如下: 代码基于数据集划分为训练集测试集。 1.多变量输入,单变量输出/可改多输出 2.多时间步预测,单时间步预测 3.评价指标:R方 RMSE MAE MAPE,对比图 4.数据从excel/csv文件中读取,直接替换即可。 5.结果保存到文本中,可以后续处理。 代码带数据,注释清晰,直接一键运行即可,适合新手小白。

    性价比革命:DeepSeekAPI成本仅为GPT-4的3%的技术揭秘.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    基于ANSYS LSDyna的DEM-SPH-FEM耦合模拟滑坡入水动态行为研究,基于ANSYS LSDyna的DEM-SPH-FEM耦合的滑坡入水模拟分析研究,基于ansys lsdyna的滑坡入水

    基于ANSYS LSDyna的DEM-SPH-FEM耦合模拟滑坡入水动态行为研究,基于ANSYS LSDyna的DEM-SPH-FEM耦合的滑坡入水模拟分析研究,基于ansys lsdyna的滑坡入水模拟dem-sph-fem耦合 ,基于ANSYS LSDyna; 滑坡入水模拟; DEM-SPH-FEM 耦合,基于DEM-SPH-FEM耦合的ANSYS LSDyna滑坡入水模拟

    auto_gptq-0.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

    auto_gptq-0.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

    复件 复件 建设工程可行性研究合同[示范文本].doc

    复件 复件 建设工程可行性研究合同[示范文本].doc

    13考试真题最近的t64.txt

    13考试真题最近的t64.txt

    Microsoft Visual C++ 2005 SP1 Redistributable PackageX86

    好用我已经解决报错问题

    嵌入式开发入门:用C语言点亮LED灯的全栈开发指南.pdf

    # 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!

    auto_gptq-0.4.2-cp38-cp38-win_amd64.whl

    auto_gptq-0.4.2-cp38-cp38-win_amd64.whl

    自动立体库设计方案.pptx

    自动立体库设计方案.pptx

    手把手教你用C语言实现贪吃蛇游戏:从算法设计到图形渲染.pdf

    # 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!

    性能对决:DeepSeek-V3与ChatGPTAPI在数学推理场景的基准测试.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    从零到一:手把手教你用Python调用DeepSeekAPI的完整指南.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

Global site tag (gtag.js) - Google Analytics