导出Flex组件为jpg图片

转载 2013年12月01日 21:02:39
前几天看了lwz7512的 《基于servlet导出Flex/Flash界面为图形文件的简单方法》,今天有时间就实践了一下。

1.使用BitmapData将flex的某个UIComponent转换为ByteArray
2.使用JPGEncoder转换ByteArray。JPGEncoder是corelib(http://code.google.com/p/as3corelib/) 的组件。我直接导入corelib.swc却报错,幸好有源代码可以直接使用。
3.使用URLRequest发送ByteArray到服务端的java servlet
4.在servlet中使用ImageIO保存图片或者输出到response

下面是具体代码

actionscript 代码
 
  1. <mx:Application   
  2.     xmlns:mx="http://www.adobe.com/2006/mxml"   
  3.     layout="absolute">  
  4.   
  5.     <mx:Script>  
  6.         [CDATA[  
  7.             import mx.controls.Alert;  
  8.             import mx.core.UIComponent;  
  9.             import mx.collections.ArrayCollection;  
  10.             import com.adobe.images.JPGEncoder;  
  11.               
  12.             [Bindable]  
  13.             public var expenses:ArrayCollection = new ArrayCollection(  
  14.                 [  
  15.                     {Month:"Jan", Profit:2000, Expenses:1500},  
  16.                     {Month:"Feb", Profit:1000, Expenses:200},  
  17.                     {Month:"Mar", Profit:1500, Expenses:500}  
  18.                 ]  
  19.             );  
  20.               
  21.             public function getJPGByteArray(target:UIComponent):ByteArray {  
  22.                 var bitmapData : BitmapData = new BitmapData(target.width, target.height);  
  23.                 bitmapData.draw(target);   
  24.                   
  25.                 var jpg : JPGEncoder = new JPGEncoder();  
  26.                 var jpgByteArray : ByteArray = jpg.encode(bitmapData);  
  27.                 return jpgByteArray;  
  28.             }  
  29.               
  30.             public function sendImageByte(target:UIComponent):void {  
  31.                 var request:URLRequest = new URLRequest("myImage");  
  32.                 request.contentType = 'applicatoin/octet-stream';  
  33.                 request.data = getJPGByteArray(target);  
  34.                 request.method = URLRequestMethod.POST;  
  35.                 navigateToURL(request, "_blank");  
  36.             }  
  37.         ]]  
  38.     </mx:Script>  
  39.   
  40.     <mx:Panel id="chartPanel" title="Bar Chart" width="300" height="400">  
  41.      <mx:BarChart id="myChart" dataProvider="{expenses}" width="100%" height="100%">  
  42.         <mx:verticalAxis>  
  43.            <mx:CategoryAxis   
  44.                 dataProvider="{expenses}"   
  45.                 categoryField="Month"  
  46.            />  
  47.         </mx:verticalAxis>  
  48.         <mx:series>  
  49.            <mx:BarSeries   
  50.                 yField="Month"   
  51.                 xField="Profit"   
  52.                 displayName="Profit"  
  53.            />  
  54.            <mx:BarSeries   
  55.                 yField="Month"   
  56.                 xField="Expenses"   
  57.                 displayName="Expenses"  
  58.            />  
  59.         </mx:series>  
  60.      </mx:BarChart>  
  61.      <mx:Legend dataProvider="{myChart}"/>  
  62.      <mx:Button label="Get Chart Image" click="sendImageByte(myChart)"/>  
  63.      <mx:Button label="Get Panel Image" click="sendImageByte(chartPanel)"/>  
  64.     </mx:Panel>  
  65.       
  66. </mx:Application>  

这里使用了一个Bar Chart图表进行实验,URLRequest的myImage是我的java servlet

java 代码
 
  1. import java.awt.image.BufferedImage;  
  2. import javax.imageio.ImageIO;  
  3. import org.apache.commons.io.IOUtils;  
  4.   
  5. public class ImageServlet extends HttpServlet {  
  6.       
  7.     @Override  
  8.     protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {  
  9.         doService(arg0, arg1);  
  10.     }  
  11.   
  12.     @Override  
  13.     protected void doPost(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {  
  14.         doService(arg0, arg1);  
  15.     }  
  16.   
  17.     private void doService(HttpServletRequest request, HttpServletResponse response) throws IOException {  
  18.         //saveImage(request, response);  
  19.         printImage(request, response);  
  20.     }  
  21.       
  22.     private void saveImage(HttpServletRequest request, HttpServletResponse response) throws IOException  {  
  23.         String fileName = "D://" + System.currentTimeMillis() + ".jpg";  
  24.         BufferedImage bufferedImage = ImageIO.read(request.getInputStream());  
  25.         if (bufferedImage != null) {  
  26.             ImageIO.write(bufferedImage, "jpeg"new File(fileName));  
  27.         }  
  28.     }  
  29.       
  30.     private void printImage(HttpServletRequest request, HttpServletResponse response) throws IOException  {  
  31.         response.setContentType("image/jpeg");  
  32.         response.setHeader("Content-Length:", String.valueOf(request.getInputStream().available()));  
  33.           
  34.         ServletOutputStream sos = response.getOutputStream();  
  35.         IOUtils.copy(request.getInputStream(), sos);  
  36.         sos.flush();  
  37.         sos.close();  
  38.     }  
  39. }  

printImage将图形输出到response,将会在web浏览器中看到图片。或者你可以使用saveImage保存图片到服务器。

 

java的io,nio和commons的io比较总结

今天有个任务,有个120M左右,内含600多W条记录,记录之间按行分隔的文件, 分割成20W条记录每个文件,以便在其他程序中导入。 由于自己手残,机器上装了WIndows,配置还太差没法布...
  • shenshen123jun
  • shenshen123jun
  • 2014年01月15日 01:33
  • 4093

Hadoop 简介 及 安装

1.什么是Hadoop 1.1 Hadoop历史渊源         Doug Cutting是Apache Lucene创始人, Apache Nutch项目开始于2002年,Apache ...
  • qq_31678877
  • qq_31678877
  • 2016年10月27日 16:03
  • 1252

【跟我学apache-commons】【四】commons-io的使用

转自: http://symphony.b3log.org/article/1377225746285  commons-io是一款处理io流的工具,封装了很多处理io流和文件的方法,可以大大简化我...
  • u011179993
  • u011179993
  • 2015年07月03日 16:43
  • 4695

Webservice客户端工程导成runnable jar包运行时出现异常

eclipse集成环境,spring 4.1.3.RELEASE + cxf 2.5.0框架,开发的Webservice客户端程序。在eclipse开发环境下运行正常,导出runnable jar包时...
  • huangying2124
  • huangying2124
  • 2016年07月11日 21:40
  • 807

1、自动构建工具Ant初步

Ant是什么?——Apache Ant是一个基于Java的生成工具。据最初的创始人James Duncan Davidson介绍,这个工具的名称是another neat tool(另一个整洁的工具)...
  • kaoa000
  • kaoa000
  • 2013年12月11日 22:55
  • 4037

如何在Eclipse中配置OpenCV开发环境

最近在看人脸识别的相关文献时,想要动手用Java代码去实现一下,OpenCV库中有许多非常经典的人脸识别算法代码可供我们去调用,那么怎样在Eclipse中配置OpenCV开发环境呢?安装jdk以及Ec...
  • colourful_sky
  • colourful_sky
  • 2017年04月06日 22:44
  • 1647

Apache Commons IO组件介绍使用

Apache Commons IO组件介绍使用介绍java io操作是开发中比较常用的技术,但是如果每次都使用原生的IO流来操作那么会显得很不比较繁琐, 因此我们可以借助apache commons ...
  • nicewuranran
  • nicewuranran
  • 2016年07月20日 15:04
  • 1294

用idea在Windows下构建spark2.2.0的环境

首先,本人菜鸡一只,如果有说的不对的地方,还请各位指点指点!如果有什么问题也可以相互交流,给我留言或者私信 说明下,之前的环境是: jdk-1.7,scala-2.10.4,spark-1.6.1...
  • lsr40
  • lsr40
  • 2017年12月01日 14:14
  • 1000

一次失败的hadoop集成eclipse的测试

1、真可谓步步该灾处处有难啊。。。     2、代码如下 package com.xx.hadoop.test.wordcount; import java.io.IOException; im...
  • darkdragonking
  • darkdragonking
  • 2017年05月17日 15:47
  • 456

Apache Commons:功能齐全的通用Java组件

Apache Commons是一个Apache项目,提供了功能齐全的通用Java组件。 Apache Commons项目由由下面三部分组成: 正常运转的项目:一组可重用的Java组件。沙箱项目...
  • ainibc
  • ainibc
  • 2016年10月19日 17:54
  • 734
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:导出Flex组件为jpg图片
举报原因:
原因补充:

(最多只允许输入30个字)