如果你有看到PCADV實驗室的新開場動畫,應該就知道我要說的是什麼,如果你是從Twitter或者其它部落格看到這篇轉載的文章,那請直接拜訪http://pcadv.twbbs.org.tw。 Flash從MX2004版開始,也就是帶入ActionScript 2.0之後,新增了BitmapData類別來處理點陣圖形,它跟另外一個類別「bitmap」的差別是:bitmap等於是BitmapData的總集合,直接將封裝後的圖形顯示在場景上;而BitmapData則是可以處理圖形中所有的像素,它門下有一個很好用的「noise」子類別,拿來產生雜訊效果非常方便。這不是什麼新玩意兒了,網路上衍伸出的應用及玩法也不少,我稍微整理了一下,歸納出一個最簡單的範例,如果你知道有更簡單或者是更好玩的用法也歡迎提出。

那些拖拖拉拉的步驟在這裡就不詳述,準備好你需要的背景圖片之後,新增一個Layer,在影格1填入以下Script:

Import flash.display.BitmapData;
//先載入BitmapData類別
Var myBitmapData:BitmapData = mew BitmapData(1024,768);
//決定雜訊效果需要使用多大的範圍,也就是要產生幾個雜訊像素。這裡依BitmapData型別建立一個BitmapData變數,並給它長與高(1024×768)個像素。
This.createEmptyMovieClip(“noiseMC”,1);
//建立一個影片物件noiseMC
noiseMC.attachBitmap(myBitmapData, 1);
//把myBitmapData,也就是要產生雜訊的像素載入noiseMC中。
noiseMC._alpha = 50;
//把noiseMC的透明度設為50,這樣背景圖片才出得來,如果你是要營造「完全收不到訊號」的電視畫面,那就設為100(或是別加這一行),也就是完全不透明。
function run() {
myBitmapData.noise(10*Math.random(), 0, 255, 1 | 2 | 4 | 8, false);
}

//產生雜訊的核心函式,在這之前noiseMC只是一個含有1024×768個像素的影片而已。函式中的0與255代表的是雜訊能呈現的色階範圍(最小、最大),如果你不想讓雜訊有那麼多顏色,就把兩者的差距縮小即可。而1、2、4、8代表的是4個顏色色版「紅(1)、綠(2)、藍(3)、Alpha(4)」,這裡全部都給他使用下去。
//至於雜訊的產生需要先有亂數,使用Math.random產生的亂數都是小於1的小數,無法給noise方法使用(因為你需要餵他一個大於1的數),所以要再乘於10。
_root.onEnterFrame = run;
//最後就讓Flash自已去跑迴圈了

這樣就完成了一個雜訊效果了,需要注意的是這個效果非常吃處理器資源,等於是把GPU擅長的事完全交給CPU做,以筆者的寫稿平台來說(P4 2.8Ghz)開一個1024×768的雜訊,影格速率設成60fps,就能讓處理器使用量飆到70~80%,而且會嚴重拖慢影片的fps。筆者的建議是做成320×240或比較低的解析度就好,也就是在宣告bitmapdata變數的那一行做修改,然後再用Flash發佈選項、HTML頁框裡的「Scale」選擇「Fit」,讓影片在瀏覽器中播放時自動放大,雖然雜訊顆粒跟背景影像會跟著被放大而失去細緻度,但是這樣一來也比較有傳統電視的feel。

當然了,如果你想做的是HDTV等級的雜訊,1920×1080的bitmapdata給它開下去,看看自已的電腦跑不跑得動吧!行有餘力的話加上掃描線效果,會更優喔!

你也可以直接修改發佈後的html檔,敘述在第10行的<param name=”scale” value=”exactfit”>,免去一直重覆發佈的麻煩。

使用 Facebook 留言

37705986cbb9edd89864160e01a14496?size=48&default=wavatar
1.  mai (發表於 2010年7月09日 16:06)
可是它說前面二行錯誤
Import flash.display.BitmapData;
//先載入BitmapData類別
Var myBitmapData:BitmapData = mew BitmapData(970,768);

請問是怎麼一的事呢?
我有新建一個空白影片片段,實體名稱為noiseMC

發表回應

謹慎發言,尊重彼此。按此展開留言規則