- 沒有新回應!
繼上次製作 [ 將 Flash 畫面另存 JPEG 圖檔 ] http://blog.xuite.net/ben19770209/ASBeginner/4037170,製作出了一個超級花費時間的範例之後,這部分的原因可能是出在 OpenAMF 傳遞陣列物件的緣故,我也沒有繼續去研究,以下這個範例是我聽了大家的意見後,直接傳遞字串資料給 Server 端,存成圖檔。
首先,請在場景上,準備一個 m1_mc 與一個 b1_btn:

然後,frame 1 的程式碼如下:
import flash.display.BitmapData;
import flash.geom.Matrix;
b1_btn.onRelease = function() {
_global.startTimer = getTimer();
//取得BitmapData
var imageBD:BitmapData = new BitmapData(m1_mc._width, m1_mc._height, false);
imageBD.draw(m1_mc, new Matrix());
//取得所有像素資料
var imageColor:String = "";
var pixelData:Array = new Array();
for (var x = 0; x< m1_mc._width; x++) {
var pixelRow:Array = new Array();
for (var y = 0; y< m1_mc._height; y++) {
pixelRow.push(String(imageBD.getPixel(x, y)));
}
pixelData.push(pixelRow);
}
imageColor = pixelData.join(";");
imageBD.dispose();
trace(getTimer()-_global.startTimer);
//送出
var my_lv:LoadVars = new LoadVars();
my_lv.imageColor = imageColor;
my_lv.onLoad = function(success:Boolean) {
if (success) {
if (this.file != null && this.file.length >0) {
_global.endTimer = getTimer();
getURL("javascript:window.alert('共花費"+((_global.endTimer-_global.startTimer)/1000)+"秒');window.open('"+this.file+"');void(0);");
//getURL(this.file, "_blank");
} else {
}
} else {
}
};
my_lv.sendAndLoad("SaveImage", my_lv, "POST");
};
|
這樣,就可以將我們從 m1_mc 取得的 BitmapData 物件的像素資料給傳送給後端的 Java Servlet 了。然後當 Java Servlet 將圖檔儲存完畢後,會將儲存的檔名回傳給 Flash 知道,這時我在 Flash 做的事情僅是 alert 一段訊息顯示花費多少時間,並且開啟該檔案。

以下畫面是當 Flash 開啟我 Java Servlet 動態建立的圖檔時,可以看出該動態產生的 JPEG 圖檔的檔名。

若是你多少懂一些 Java 程式的話,以下這是該 Java Servlet 的原始碼:
package idv.ben.flash2image;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.awt.image.BufferedImage;
import com.sun.image.codec.jpeg.*;
/**
* Servlet implementation class for Servlet: SaveImage
*
*/
public class SaveImage extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
String imageColor = request.getParameter("imageColor");
if(imageColor!=null && imageColor.length() >0){
BufferedImage bi = null;
String[] cols = imageColor.split(";");
for(int x=0; x< cols.length; x++){
String[] rows = cols[x].split(",");
for(int y=0; y< rows.length; y++){
if(bi==null){
bi = new BufferedImage(cols.length, rows.length, BufferedImage.TYPE_INT_RGB);
}
bi.setRGB(x, y, Integer.parseInt(rows[y]));
}
}
if(bi!=null){
try{
String fileName = Calendar.getInstance().getTime().getTime() + ".jpg";
File f = new File(this.getServletContext().getRealPath(fileName));
OutputStream os = new FileOutputStream(f);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os);
encoder.encode(bi);
out.println("file=" + f.getName());
} catch(IOException ioe){
ioe.printStackTrace();
}
}
}
out.close();
}
} |
我儲存的圖檔寬高為 400 x 300,若是檔案寬高再小一些的話,相對傳送的像素資料會較少,儲存速度也會更快。


