套件 | flash.filters |
類別 | public final class ColorMatrixFilter |
繼承 | ColorMatrixFilter BitmapFilter Object |
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 1.0, Flash Player 9 |
注意:以 RGBA 值而言,最高有效位元組代表紅色色版值,接著是綠色、藍色和 Alpha。
若要建立新的顏色矩陣濾鏡,請使用 new ColorMatrixFilter()
語法。 濾鏡的使用取決於濾鏡套用到的物件:
- 若要將濾鏡套用至影片片段、文字欄位、按鈕與視訊,請使用
filters
屬性 (從 DisplayObject 繼承而來)。 設定物件的filters
屬性不會修改該物件,而且只要清除filters
屬性就可以移除濾鏡。 - 若要將濾鏡套用至 BitmapData 物件,請使用
BitmapData.applyFilter()
方法。 對 BitmapData 物件呼叫applyFilter()
時會採用原始 BitmapData 物件和濾鏡物件,結果會產生套用濾鏡後的影像。
如果您將濾鏡套用至顯示物件,該顯示物件的 cacheAsBitmap
屬性就會設定為 true
。 如果您移除所有濾鏡,就會還原 cacheAsBitmap
的原始值。
如果產生的影像超過最大尺寸,系統就不會套用濾鏡。在 AIR 1.5 和 Flash Player 10 中,最大寬度或高度為 8,191 像素,而且像素總計不得超過 16,777,215 像素。(因此,如果影像寬度為 8,191 像素,則其高度上限為 2,048 像素)。若為 Flash Player 9 和 AIR 1.1 及其更早版本,高度和寬度的上限都是 2,880 像素。例如,當您在套用某個濾鏡的大型影片片段上進行放大顯示時,如果產生的影像達到最大尺寸,便會關閉該濾鏡。
相關 API 元素
flash.display.BitmapData.applyFilter()
flash.display.DisplayObject.filters
flash.display.DisplayObject.cacheAsBitmap
屬性 | 定義自 | ||
---|---|---|---|
constructor : Object
類別物件的參照或是特定物件實體的建構函數。 | Object | ||
matrix : Array
用於 4 x 5 顏色轉換的 20 個項目陣列。 | ColorMatrixFilter |
方法 | 定義自 | ||
---|---|---|---|
ColorMatrixFilter(matrix:Array = null)
以指定的參數初始化新的 ColorMatrixFilter 實體。 | ColorMatrixFilter | ||
[覆寫]
傳回此濾鏡物件的副本。 | ColorMatrixFilter | ||
指出物件是否有已定義的指定屬性。 | Object | ||
指出 Object 類別的實體是否位於指定為參數的物件原型鏈中。 | Object | ||
指出指定的屬性是否存在,以及是否可列舉。 | Object | ||
為迴圈作業設定動態屬性的可用性。 | Object | ||
傳回代表此物件的字串,根據地區特定慣例進行格式化。 | Object | ||
會傳回指定之物件的字串形式。 | Object | ||
會傳回指定之物件的基本值。 | Object |
matrix | 屬性 |
matrix:Array
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 1.0, Flash Player 9 |
用於 4 x 5 顏色轉換的 20 個項目陣列。 matrix
屬性無法藉由直接修改其值來變更 (例如,myFilter.matrix[2] = 1;
)。 相反地,您必須先取得陣列的參照,再對該參照進行變更,然後重設數值。
這個顏色矩陣濾鏡分別以 srcR、srcG、srcB、srcA 來表示每個原始像素的紅色、綠色、藍色和 Alpha 組件。 若要計算四個色版的個別結果,請將影像中每個像素的值乘以變形矩陣中的值。 您可以選擇性地在每個結果 (矩陣每一列中的第五個項目) 加上介於 -255 到 255 之間的偏移值。 濾鏡會將每個顏色組件合併為單一像素,並且將結果寫入。 在下列公式中,a[0] 到 a[19] 對應到 20 項目陣列 (傳遞至 matrix
屬性) 中的項目 0 到 19:
redResult = (a[0] * srcR) + (a[1] * srcG) + (a[2] * srcB) + (a[3] * srcA) + a[4] greenResult = (a[5] * srcR) + (a[6] * srcG) + (a[7] * srcB) + (a[8] * srcA) + a[9] blueResult = (a[10] * srcR) + (a[11] * srcG) + (a[12] * srcB) + (a[13] * srcA) + a[14] alphaResult = (a[15] * srcR) + (a[16] * srcG) + (a[17] * srcB) + (a[18] * srcA) + a[19]
以陣列中的每個顏色值來說,值 1 等於要傳送至輸出的 100% 色版,可保留顏色色版的值。
計算過程會在尚未相乘的顏色數值上執行。 如果輸入的圖像包含預先相乘的顏色數值,則那些數值會自動轉換成尚未相乘的顏色數值以供執行這項運算。
共有兩種可用的最佳化模式:
僅限 Alpha。當您將僅能調整 Alpha 組件的矩陣 (如下所示) 傳遞給濾鏡時,濾鏡可使其效能最佳化:
1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 N 0 (where N is between 0.0 and 1.0)
快速版本。 僅適用於支援 SSE/AltiVec 加速器的處理器,例如 Intel® Pentium® 3 和更新版本,以及 Apple® G4 和更新版本。當乘數項介於 -15.99 到 15.99 的範圍之間,且加法項 a[4]、a[9]、a[14],和 a[19] 介於 -8000 到 8000 的範圍之間,才會使用加速器。
實作
public function get matrix():Array
public function set matrix(value:Array):void
擲回值
TypeError — 設定時,Array 為 null
|
ColorMatrixFilter | () | 建構函式 |
clone | () | 方法 |
override public function clone():BitmapFilter
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 1.0, Flash Player 9 |
傳回此濾鏡物件的副本。
傳回值BitmapFilter — 新的 ColorMatrixFilter 實體,其所有屬性都和原始實體的屬性相同。
|
buildChild()
四次,以載入並顯示四個影像實體。 第一次呼叫 buildChild()
時,以 null
做為引數,不對第一個實體套用濾鏡。 對於後續每個對 buildChild()
的呼叫,採用套用不同顏色矩陣濾鏡的參數做為引數,將其套用至後續的每個影像實體。
buildChild()
函數會建立新的 Loader 物件,名稱為 loader
。 對於每個對 buildChild()
的呼叫、附接事件偵聽程式到 Loader 物件以偵聽 complete
事件,皆由傳入 buildChild()
的函數處理。
The applyRed()
、applyGreen()
和 applyBlue()
函數會使用不同的 matrix
陣列值,以達到不同的效果。
注意:為達到最佳效果,請使用寬度約為 80 像素的影像。 影像檔的名稱和位置應該與您傳遞至 url
屬性的值相符。 例如,在範例中傳入的 url
值會指向一個名為 "Image.jpg" 的影像檔,該檔案位於與 SWF 檔案相同的目錄。
package { import flash.display.DisplayObject; import flash.display.Loader; import flash.display.Sprite; import flash.events.Event; import flash.events.IOErrorEvent; import flash.filters.ColorMatrixFilter; import flash.net.URLRequest; public class ColorMatrixFilterExample extends Sprite { private var size:uint = 140; private var url:String = "Image.jpg"; public function ColorMatrixFilterExample() { buildChild(null); buildChild(applyRed); buildChild(applyGreen); buildChild(applyBlue); } private function buildChild(loadHandler:Function):void { var loader:Loader = new Loader(); loader.x = numChildren * size; loader.y = size; loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); if (loadHandler != null) { loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadHandler); } var request:URLRequest = new URLRequest(url); loader.load(request); addChild(loader); } private function applyRed(event:Event):void { var child:DisplayObject = DisplayObject(event.target.loader); var matrix:Array = new Array(); matrix = matrix.concat([1, 0, 0, 0, 0]); // red matrix = matrix.concat([0, 0, 0, 0, 0]); // green matrix = matrix.concat([0, 0, 0, 0, 0]); // blue matrix = matrix.concat([0, 0, 0, 1, 0]); // alpha applyFilter(child, matrix); } private function applyGreen(event:Event):void { var child:DisplayObject = DisplayObject(event.target.loader); var matrix:Array = new Array(); matrix = matrix.concat([0, 0, 0, 0, 0]); // red matrix = matrix.concat([0, 1, 0, 0, 0]); // green matrix = matrix.concat([0, 0, 0, 0, 0]); // blue matrix = matrix.concat([0, 0, 0, 1, 0]); // alpha applyFilter(child, matrix); } private function applyBlue(event:Event):void { var child:DisplayObject = DisplayObject(event.target.loader); var matrix:Array = new Array(); matrix = matrix.concat([0, 0, 0, 0, 0]); // red matrix = matrix.concat([0, 0, 0, 0, 0]); // green matrix = matrix.concat([0, 0, 1, 0, 0]); // blue matrix = matrix.concat([0, 0, 0, 1, 0]); // alpha applyFilter(child, matrix); } private function applyFilter(child:DisplayObject, matrix:Array):void { var filter:ColorMatrixFilter = new ColorMatrixFilter(matrix); var filters:Array = new Array(); filters.push(filter); child.filters = filters; } private function ioErrorHandler(event:IOErrorEvent):void { trace("Unable to load image: " + url); } } }
Tue Jun 12 2018, 03:47 PM Z