转:导出Flex组件为jpg图片(http://xinsync.xju.edu.cn/index.php/archives/1176)
2008-09-02 16:25
351 查看
前几天看了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 代码
<mx:Application
xmlns:mx=“http://www.adobe.com/2006/mxml”
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 {
//saveImage(request, response);
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保存图片到服务器。
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 代码
<mx:Application
xmlns:mx=“http://www.adobe.com/2006/mxml”
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 {
//saveImage(request, response);
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保存图片到服务器。
相关文章推荐
- http://acm.hrbeu.edu.cn/index.php?act=problem&id=1001&cid=19 人工湖的公路
- 导出Flex组件为jpg图片
- http://acm.hdu.edu.cn/showproblem.php?pid=2446
- nefu 84 http://acm.nefu.edu.cn/test/problemshow.php?problem_id=84
- nefu 117 素数分布 http://acm.nefu.edu.cn/test/problemshow.php?problem_id=117
- HDU 1455 http://acm.hdu.edu.cn/showproblem.php?pid=1455
- http://acm.hdu.edu.cn/showproblem.php?pid=1142
- http://acm.hdu.edu.cn/showproblem.php?pid=2717,有所借鉴哦!!
- Choose the best route(http://acm.hdu.edu.cn/showproblem.php?pid=2680)
- http://acm.hdu.edu.cn/showproblem.php?pid=4512
- http://xinsheng.huawei.com/cn/forum/index.php?app=forum&mod=Detail&act=index&id=355911
- http://acm.hdu.edu.cn/showproblem.php?pid=1542 矩形面积的并 线段树 + 扫描线 + 离散化
- http://acm.hdu.edu.cn/showproblem.php?pid=1541 结点更新求最左区间的个数
- 字符输入时注意的格式(特殊情况)http://acm.hdu.edu.cn/showproblem.php?pid=1860
- To The Max &&http://acm.hdu.edu.cn/showproblem.php?pid=1081
- http://acm.hdu.edu.cn/showproblem.php?pid=1686
- http://acm.hdu.edu.cn/showproblem.php?pid=2227 dp + 线段树
- http://acm.hdu.edu.cn/showproblem.php?pid=3450 线段树 + dp
- http://acm.hdu.edu.cn/showproblem.php?pid=3342&&拓扑入门题
- hdu 1085 http://acm.hdu.edu.cn/showproblem.php?pid=1085