將 Flash 畫面另存 JPEG 圖檔(修正版) @ 邦邦的部落格 :: 隨意窩 Xuite日誌
  • 留言 & 文章索引
    1. 沒有新回應!
  • 流量統計
  • 2000年8月,
    加入e21摩奇創意,開始接觸 Flash 4。

    2004年3月,
    參與MMUG,分享與討論。

    2004年11月,
    通過 VUE 的 Flash MX 2004 Developer 認證。

    2005年6月,
    開始寫 Blog 分享自己所學。

    2005年7月,
    通過 MCI(Macromedia Certified Instractor) - Flash MX 2004 Developer 講師認證。

    2005年12月,
    終於於 DCI 拿到證書,正式成為第一屆也是最後一屆 Macromedia 的認證講師......$%&@#

    2006年8月,
    通過 ACI(Adobe Certified Instractor) - FlashLite 1.1 講師認證。

    2007年3月,
    離開待了六年半的摩奇創意,轉換跑道到BenQ。

    2007年5月,
    http://blog.ben.idv.tw

    2007年9月,
    BenQ品牌代工分家,我們變成新BenQ的母公司佳世達Qisda。

    2008年9月,
    因公司採用技術策略的轉變,故離開待了一年半的Qisda。

    2009年2月,
    加入一家低調的軟體公司,低調的開發著 Flash Game,呵呵~







  • 如何使用RSS
    Powered by Xuite
    2006-01-10 23:34 將 Flash 畫面另存 JPEG 圖檔(修正版)
    平均分數:0 顆星    投票人數:0
    我要評分:

    繼上次製作 [ 將 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,若是檔案寬高再小一些的話,相對傳送的像素資料會較少,儲存速度也會更快。

    邦邦 / Xuite日誌 / 回應(51) / 引用(0) / 好文轉寄
    回應