搜尋部落格文章

2013年7月11日 星期四

[轉] ColorMatrixFilter顏色矩陣濾鏡詳細介紹

顏色矩陣
在flash中可以用矩陣方便的操作顏色。 在flash8以前的版本,操作顏色的唯一途徑就是通過修改顏色對像中紅,綠,藍三個通道的值,在Flash8,"顏色矩陣濾鏡" ColorMatrixFilter (flash.filters.ColorMatrixFilter) 在顆粒等級上提供給你更好的控制方法。 "顏色矩陣濾鏡"為4行5列的多維矩陣(20個元素的數組)。 圖4 是與"顏色矩陣濾鏡"等同的矩陣。
Flash中的顏色矩陣
圖4.與"顏色矩陣濾鏡"等同的矩陣
紅,綠,藍通道的值由如下所示計算方法所決定:
CODE:
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]
可以看出,第一行的值決定了紅色值,第二行決定綠色,第三行藍色,第四行是透明(Alpha)通道值。 同樣可以看出首四欄值是與紅,綠,藍,alpha通道值的乘積,而第五欄的值分別是和(偏移量)。 注意每行的源值和結果值都是在0到255的區間內。 因此即使各個通道的值小於0或大於255都會被強製到該區間內。 我來舉些例子說明它的原理。
果你想在紅色通道加100(偏移量),將a[4]設置為100,如(圖5) 。
Flash中的顏色矩陣
圖5.紅色值增加100
如果想使綠色通道加倍,將a[6]設為2,如(圖6)
Flash中的顏色矩陣
圖6.綠色加倍
如果你要使結果圖像中的藍色與原圖的紅色數量相等,將a[10]設為1, a[12]設為0 ,如(圖7)
Flash中的顏色矩陣
圖7.紅色決定藍色值
改變圖像的,你需要在每個顏色通道的值改變同樣的數量。 最簡單的途徑是在每個通道都設置相同的偏移量。 偏移量為正時可以增加亮度為負時可以減小亮度。 (圖8) 是一個增加亮度的例子。
Flash中的顏色矩陣
圖8.增加亮度
你也可以通過將每個顏色通道與一個值相乘按比例的改變亮度,大於1的增加亮度小於1減小亮度。
按照原理,將圖像轉換為灰度圖,你需要將每個通道的部分設為等值。 因為有三個通道,你可以將每個通道乘以0.33並將它們相加得到結果值。 如(圖9)
Flash中的顏色矩陣
圖9.灰度圖矩陣
由於不同顏色通道的相對屏幕發光度,但是確實有特殊的提供更加真實的灰度圖的"亮度係數"值。 例如在PS裡創建一個純綠色塊然後把它放在一個純藍色塊,然後將圖像灰度化,你會看到原來綠色的地方的灰色會比原來藍色的區域要亮。
在Flash裡使用這些矩陣,創建一個"顏色矩陣濾鏡"的實例然後將它加入到一個影片剪輯(MovieClip)實例上。 下面是一個使綠色加倍的例子:
CODE: 
import flash.filters.ColorMatrixFilter;
var mat:Array = [ 1,0,0,0,0,
0,2,0,0,0,
0,0,1,0,0,
0,0,0,1,0 ];
var colorMat:ColorMatrixFilter = new ColorMatrixFilter(mat);
clip.filters = [colorMat];
"顏色矩陣濾鏡"與一個已知的矩陣使用,你可以完成除了亮度和灰度之外複雜的顏色調整。 調整對比度,飽和度和色相在Flash 8種都成為了肯能。 雖然在這裡討論這些話題與這篇文章有些遠,但是足以說Flash 8提供了一個以前任何版本都不能做到的顏色操作途徑。

2013年7月9日 星期二

[轉] Capabilities 獲得使用者端資訊

 as3.中的flash.system.Capabilities 類有許多靜態方法返回關於播放器和計算機的信息,比如操作系統,語言,音頻和視頻。 通過Capabilities 屬性確定用戶所擁有的設備的類型,可以向盡可能多的用戶提供適當的內容。 更有用的是可以通知服務器發送合適的SWF 文件,或是通知SWF 文件變更其播放方式。 

檢測播放器版本 
version屬性指定Flash Player平台和版本信息。 
trace("version: " + Capabilities.version); //我的電腦返回version: WIN 9,0,45,0 
這裡需要解釋一下,返回的數據以此是:平台主版本號次版本號生成版本號內部生成版本號。 看出我的flash播放器是9.0版。 
檢測操作系統 
os屬性指定當前的操作系統 
trace("os: " + Capabilities.os); //Windows XP 
apple上返回的還帶有版本號,我們能基於系統做一些事情,比如載入不同的開始畫面 
var os:String = System.capabilities.os.substr(0, 3); 
if (os == "Win") { 
// 載入微軟標示或者... 
} else if (os == "Mac") { 
// 看到缺一口滴蘋果 
} else { 
// ... 
} 
檢測播放器類型 
playerType指定播放器的類型 
trace("playerType: " + Capabilities.playerType);//可能返回以下四種結果 
"StandAlone" ,用於獨立的Flash Player 
"External" ,用於外部的Flash Player或處於測試模式下 
"PlugIn" ,用於Flash Player瀏覽器插件 
"ActiveX"
 
"ActiveX"
 ,用於Microsoft Internet Explorer使用的Flash Player ActiveX控件如果我們用腳本進行交互,就必須知道播放器在ie裡運行還是別的什麼瀏覽器,如果是獨立運行,很抱歉腳本失效料。
 
if(flash.system.Capabilities.playerType == "Plugin") { 
// 在除ie的瀏覽器執行的東西 
} 
else if(flash.system.Capabilities.playerType == "ActiveX") { 
// 在ie中執行的as 
} 
else { 
// 其他 
} 
檢測系統語言 
language指定系统语言
trace("language: " + Capabilities.language);//zh-CN
顾名思义,如果我们要做国际化的flash,就会用到,检测不同语言然后载入不同的swf文件
var lang:String = System.capabilities.language.substr(0, 2);
// 创建支持语言数组
var supportedLanguages:Array = ["en", "es", "fr"];
// 设置默认语言.
var useLang:String = "en";
//循环匹配,如果找到,设置useLang
for (var i:int = 0; i < supportedLanguages.length; i++) {
if (supportedLanguages[i] == lang) {
useLang = lang;
break;
}
}
// 载入对应Flash
var movieURL:String = "myMovie_" + useLang + ".swf");

检测显示设置这个当然很有用了!其实很简单fg
trace("screenResolutionX: " + Capabilities.screenResolutionX);//1280
trace("screenResolutionY: " + Capabilities.screenResolutionY);//960 
指定系统语言
trace("language: " + Capabilities.language);//zh-CN
顾名思义,如果我们要做国际化的flash,就会用到,检测不同语言然后载入不同的swf文件
var lang:String = System.capabilities.language.substr(0, 2);
// 创建支持语言数组
var supportedLanguages:Array = ["en", "es", "fr"];
// 设置默认语言.
var useLang:String = "en";
//循环匹配,如果找到,设置useLang
for (var i:int = 0; i < supportedLanguages.length; i++) {
if (supportedLanguages[i] == lang) {
useLang = lang;
break;
}
}
// 载入对应Flash
var movieURL:String = "myMovie_" + useLang + ".swf");

检测显示设置这个当然很有用了!其实很简单fg
trace("screenResolutionX: " + Capabilities.screenResolutionX);//1280
trace("screenResolutionY: " + Capabilities.screenResolutionY);//960
ok,知道屏幕尺寸我们可以作很多有用的事情拉我们可以根据情况载入不同的尺寸的内容。
var resX:int = flash.system.Capabilities.screenResolutionX;
var resY:int = flash.system.Capabilities.screenResolutionY;
if ( (resX <= 240) && (resY <= 320) ) {
var url:String = "main_pocketPC.swf";
}
else {
var url:String = "main_desktop.swf";
}
loader.load(new URLRequest(url));
利用分辨率还可以居中你的弹出窗口:
var resX:int = flash.system.Capabilities.screenResolutionX;
var resY:int = flash.system.Capabilities.screenResolutionY;
//设置窗口的宽和高
var winW:int = 200;
var winH:int = 200;
// 设置窗口起始坐标
var winX:int = (resX / 2) - (winW / 2);
var winY:int = (resY / 2) - (winH / 2);
// 创建代码,然后传递给URLLoader.load( )
// 打开新浏览器窗口
var jsCode:String = "javascript:void(
newWin=window.open('http://www.person13.com/'," +
"'newWindow', 'width=" + winW +
", height=" + winH + "," +
"left=" + winX + ",top=" + winY + "'));";
// 使用URLLoader 对象调用JavaScript 函数
urlLoader.load(new URLRequest(jsCode));

检测设备音频
hasAudio
 检测设备音频hasAudio指定播放器是否在具有音頻功能的系統上運行 
hasMP3指定播放器是在有沒有MP3解碼器的系統上運行 
trace("hasMP3: " + Capabilities.hasMP3);//true 
trace("hasAudio: " + Capabilities.hasAudio);//true 
因為聲音文件是非常大的,對於網絡來說。 我們通常會避免沒有音頻的用戶下載音頻文件。 
// 只有當播放器可以播放聲音才再如包含聲音的.swf 
if (flash.system.Capabilities.hasAudio) { 
content = "sound.swf"; 
} else { 
content = "silent.swf"; 
} 
//即時系統有播放音頻能力也不意味著它有播放mp3的能力。 因此當發布含有mp3內容時應用 
flash.system.Capabilities.hasMP3 屬性檢測下目標設備。 
if (flash.system.Capabilities.hasMP3) { 
var url:URLRequest = new URLRequest("sound.mp3"); 
sound = new Sound(url); 
sound.play( ); 
} else { 
// code to load an external .swf containing a ADCP sound 
} 
檢測設備視頻 
hasEmbeddedVideo指定播放器是否支持嵌入視頻 
hasStreamingVideo指定播放器是否支持視頻流首先檢測用戶能否播放視頻流,如果返回false ,再檢測能否支持內嵌視頻,如下 
if(flash.system.Capabilities.hasStreamingVideo) { 
// 播放視頻流 
} 
else if(flash.system.Capabilities.hasEmbeddedVideo) { 
// 下載內嵌視頻的swf文件 
} 
else { 
// 
}