使用flash能做出很好的界面或者图表(chart),但是如何将这些内容保存成图片呢,这个问题是个值得考虑的难题。本文将简单的描述一下解决思路并给出代码。
1。第一步:获取要导出的flash图形数据
通过AS3的bitmapdata类将界面上某个要截取的diplayobject转换为ByteArray,通过ExternalInterface传递给html页面中的表单。
2。第二步:将转换的位图数据传递到后台
这个是最难的部分,如果采用flex的数据服务则代价昂贵,如果采用amfphp/openphp又比较麻烦,那怎么办呢?
解决方法:将bytearray编码为base64的字符串进行http传递。
3。第三步:将客户端传来的数据转换为图形文件
既然前端传来的是base64字符串,那就需要基于java的base64解码方法,然后转换为byte[],这样就可以生成图形文件了。
下面给出需要的资源:
a)bitmapdata转换为图形ByteArray的类:
http://www.kaourantin.net/2005/10/more-fun-with-image-formats-in-as3.html
b)bytearray转换为base64编码的类:
c)解码base64字符串为byte[]的类:
前几天看了lwz7512的 《
基于servlet导出Flex/Flash界面为图形文件的简单方法》,今天有时间就实践了一下。
1.使用BitmapData将flex的某个UIComponent转换为ByteArray
2.使用JPGEncoder转换ByteArray。JPGEncoder是corelib() 的组件。我直接导入corelib.swc却报错,幸好有源代码可以直接使用。
3.使用
URLRequest发送ByteArray到服务端的java servlet
4.在servlet中使用ImageIO保存图片或者输出到response
下面是具体代码
actionscript 代码
- <mx:Application
- xmlns:mx=""
- layout="absolute">
-
- <mx:Script>
- [CDATA[
- import mx.controls.Alert;
- import mx.core.UIComponent;
- import mx.collections.ArrayCollection;
- import com.adobe.images.JPGEncoder;
-
- [Bindable]
- public var expenses:ArrayCollection = new ArrayCollection(
- [
- {Month:"Jan", Profit:2000, Expenses:1500},
- {Month:"Feb", Profit:1000, Expenses:200},
- {Month:"Mar", Profit:1500, Expenses:500}
- ]
- );
-
- public function getJPGByteArray(target:UIComponent):ByteArray {
- var bitmapData : BitmapData = new BitmapData(target.width, target.height);
- bitmapData.draw(target);
-
- var jpg : JPGEncoder = new JPGEncoder();
- var jpgByteArray : ByteArray = jpg.encode(bitmapData);
- return jpgByteArray;
- }
-
- public function sendImageByte(target:UIComponent):void {
- var request:URLRequest = new URLRequest("myImage");
- request.contentType = 'applicatoin/octet-stream';
- request.data = getJPGByteArray(target);
- request.method = URLRequestMethod.POST;
- navigateToURL(request, "_blank");
- }
- ]]
- mx:Script>
-
- <mx:Panel id="chartPanel" title="Bar Chart" width="300" height="400">
- <mx:BarChart id="myChart" dataProvider="{expenses}" width="100%" height="100%">
- <mx:verticalAxis>
- <mx:CategoryAxis
- dataProvider="{expenses}"
- categoryField="Month"
- />
- mx:verticalAxis>
- <mx:series>
- <mx:BarSeries
- yField="Month"
- xField="Profit"
- displayName="Profit"
- />
- <mx:BarSeries
- yField="Month"
- xField="Expenses"
- displayName="Expenses"
- />
- mx:series>
- mx:BarChart>
- <mx:Legend dataProvider="{myChart}"/>
- <mx:Button label="Get Chart Image" click="sendImageByte(myChart)"/>
- <mx:Button label="Get Panel Image" click="sendImageByte(chartPanel)"/>
- mx:Panel>
-
- mx:Application>
这里使用了一个Bar Chart图表进行实验,
URLRequest的myImage是我的java servlet
java 代码
- import java.awt.image.BufferedImage;
- import javax.imageio.ImageIO;
- import org.apache.commons.io.IOUtils;
-
- public class ImageServlet extends HttpServlet {
-
- @Override
- protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
- doService(arg0, arg1);
- }
-
- @Override
- protected void doPost(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
- doService(arg0, arg1);
- }
-
- private void doService(HttpServletRequest request, HttpServletResponse response) throws IOException {
-
- printImage(request, response);
- }
-
- private void saveImage(HttpServletRequest request, HttpServletResponse response) throws IOException {
- String fileName = "D://" + System.currentTimeMillis() + ".jpg";
- BufferedImage bufferedImage = ImageIO.read(request.getInputStream());
- if (bufferedImage != null) {
- ImageIO.write(bufferedImage, "jpeg", new File(fileName));
- }
- }
-
- private void printImage(HttpServletRequest request, HttpServletResponse response) throws IOException {
- response.setContentType("image/jpeg");
- response.setHeader("Content-Length:", String.valueOf(request.getInputStream().available()));
-
- ServletOutputStream sos = response.getOutputStream();
- IOUtils.copy(request.getInputStream(), sos);
- sos.flush();
- sos.close();
- }
- }
printImage将图形输出到response,将会在web浏览器中看到图片。或者你可以使用saveImage保存图片到服务器。