2009年11月16日星期一

奧多比宣佈推出 LiveCycle Enterprise Suite 2


擁有行動裝置存取、Flash 基礎工作空間及雲端部署功能,能建置滿足客戶互動需求的商業關鍵應用程式

【2009 年 11 月 16 日,台北訊】全球軟體大廠奧多比今日宣佈推出 Adobe® LiveCycle® Enterprise Suite 2(ES2),這項新世代產品將協助企業及政府單位跨越各種設備及途徑,建構改善客戶互動關係的多樣化應用程式,同時奧多比亦宣布新的經銷合作夥伴 - 耐特普羅資訊公司(NetPro),預計將為企業客戶提供LiveCycle ES2 伺服器產品的銷售與全方位服務。LiveCycle ES2 能大幅提升 IT 及商務營運管理人員的生產效能,提供 RIA(Rich Internet Application;豐富型網際網路應用程式)框架(framework),用以建置客製化的 RIA 工作空間、行動與桌面存取關鍵應用程式,同時還能執行雲端部署。透過 LiveCycle ES2,企業將可在應用程式中連結自動化流程並嵌入即時協同整合效能,藉由提供個人化體驗,進一步改善客戶關係並大幅提昇員工生產力。為提供企業更詳細的 LiveCycle ES2 相關資訊,奧多比將於 12 月 22 日與 23 日分別假台北遠東飯店與新竹國賓飯店舉辦「讓 RIA 引領企業進入 Business 2.0 - Adobe LiveCycle ES2 上市發表會」活動,會中將介紹 LiveCycle ES2 諸多強化企業資訊平台的解決方案,讓企業更有效建立用戶導向的應用程式。此研討會為免費入場,座位有限,請盡早報名!如欲了解更多活動相關資訊,請參閱:www.myadobe.com.tw/2009。

「Adobe LiveCycle ES2 是我們實現商業流程自動化目標的理想解決方案。透過這項產品的最新版本,我們將能在自動化流程領域取得絕佳效率,更廣泛接觸員工、合作夥伴及客戶。」德意志電訊(Deutsche Telekom)公司個人電信服務部門資訊長 Rainer Hahn 表示:「Adobe LiveCycle ES2 是一項彈性化且容易使用的方案,能為我們快速轉換複雜的商業流程,達成最佳的商業目標!」

「Adobe LiveCycle ES2 能夠讓企業,運用各種經常使用於個人生活、社交媒體、行動及消費應用程式上的資訊格式,打造符合人們工作模式的軟體解決方案 - 這將是驅動企業在今日經濟環境中致勝的關鍵所在。」奧多比商業生產力事業部門資深副總裁暨部門總經理 Rob Tarkoff 表示:「LiveCycle ES2 提供多項強大的工具及開發環境,例如以模組驅動的應用程式開發、自助式 RIA 框架、以及高效率的程式編輯工具,確保企業可輕鬆打造用於高效率製作、擷取與交換關鍵資訊的應用程式。」

用戶無需再忍受傳統不易使用、系統導向的應用程式,LiveCycle ES2 現在能與 Flash 平台及 PDF 技術更緊密整合,讓企業開發人員妥善建置用戶導向的應用程式。全新的 Adobe 應用程式模組技術能夠減少程式碼數量並簡化資料及服務整合,提升 Adobe Flex 及 LiveCycle 開發人員生產力,讓他們能更有效率編寫應用程式。同時,LiveCycle ES2 為 Adobe Flash Builder 4 測試版所設計的全新外掛程式,可讓開發人員高效率將 LiveCycle ES2 技術嵌入任何以 Flex 為基礎的應用程式。此外,全新 Adobe® LiveCycle® Collaboration Service(之前名稱為 Adobe Flash Collaboration Service)主控服務能為開發人員與企業提供可擴充的解決方案,讓他們輕鬆地在現有或新增的RIA 中,建置即時、多用戶的協同整合功能。這項強大且具彈性的開發框架將加速企業開發人員,開發及部署以用戶為中心應用程式的時程。

全新 Adobe® LiveCycle® Mosaic ES2 是一項複合式的 RIA 框架,能夠快速組合各種直覺式、個人化及活動導向的 RIA應用程式。開發人員只要將他們的商業邏輯與用戶介面顯示於應用程式「tiles」中,就能延續現有的企業應用程式。「tiles」 是一項元件多向溝通能力的使用者介面應用程式元件,能夠被組合成統一的檢閱模式,配合用戶的工作習慣與特定需求。用戶可以在多重任務之間進行切換,完全不會在過程中遺漏任何進度,同時也可以儲存工作空間,以便稍後繼續原有的工作。

LiveCycle ES2 能夠為關鍵商務流程的參與模式帶來更多選擇。透過 Adobe® LiveCycle® Workspace ES2 Mobile,用戶可以運用 iPhone、Blackberry™ 及 Windows™ Mobile 等裝置存取 LiveCycle ES2,在行動模式下隨時參與工作。Adobe® LiveCycle® Launchpad ES2 則是提供了非常簡易的 LiveCycle ES 桌面存取功能,用戶可以透過簡單的拖放介面製作 PDF,或是為文件保全流程加入安全規定。

奧多比同時也宣佈將為企業客戶推出擁有完整管理功能的 LiveCycle ES2 雲端部署服務,同時還將整合奧多比的24x7 全年無休監控及支援服務,包括產品升級。LiveCycle ES2 預先配置個體(instance)將主控於 Amazon Web Services 雲端運算環境中,為企業帶來更快速的部署路徑及較低的整體持有成本(TCO)。

為了進一步簡化部署程序及強化時效,奧多比也同時擴充了旗下的「Adobe Solution Accelerators」系列。「Adobe Solution Accelerators」是以 LiveCycle ES2 為基礎所打造,能夠協助企業展開專案計劃及原型規劃,並且縮短開發時程。除適用於金融服務機構的「開戶系統範本(Account Enrollment Solution Accelerator)」及「可信賴的文件發佈系統範本(Correspondence Management Solution Accelerator)」,奧多比現在還為政府機構增加了「服務申請系統範本(Benefits and Services Delivery Solution Accelerator)」、為生物科技醫療機構增加的「電子審核流程範本(Electronic Submissions Solution Accelerator)」、以及為商業及政府機構增設的「人事表單系統範本(Human Capital Applications Solution Accelerator)」。「Adobe Solution Accelerators」能夠提供最佳的執行方法、用戶介面與流程範例、以及程式碼建構模組,用以擴展 LiveCycle ES2 功能。

價格與上市時間

Adobe LiveCycle ES2 預計將於2009年底上市,Adobe LiveCycle ES2 雲端部署選項,則預計將於 2010 年初面市。如需更多相關資訊,請造訪:www.adobe.com/livecycle。

耐特普羅資訊(NetPro)簡介

耐特普羅資訊公司(NetPro)成立於1995年,由深耕儲存領域之核心事業開始,於國內IT服務產業建立了專業的口碑,也深獲客戶之肯定。隨著業務的拓展與集團資源之整合,NetPro揭櫫「Data Service」之企業價值,以客戶資料為中心,由儲存、資訊管理、商業智能三大事業行銷處自各層面提供相關的解決方案。欲查詢更多詳細資料,請至耐特普羅公司網站:www.netpro.com.tw。

奧多比公司簡介

奧多比提供革命性技術,讓人們隨時隨地都能透過任何媒體,完美的利用創意、資訊與世界溝通。欲查詢更多詳細資料,請至奧多比公司主網站:www.adobe.com 或台灣分公司網站:www.adobe.com/tw。

※由頤德國際 (Veda International Corp.) 代表奧多比公司 (Adobe Systems) 發稿。

2009年11月11日星期三

Away3DLite 使用 Collada

Away3DLite 1.0 出一陣子了:
http://away3d.com/away3d-lite-v1-0-fastest-and-smallest-3d-engine-in-flash

號稱很小、很快,因為使用了 Flash Player 10 提供的 3D 語法,所以限制一定要使用 FP10 瀏覽才行。

以下,我作一個簡單的範例,載入一個 Collada 格式的 *.dae 模型檔案,這個 *.dae 可由各種 3D 建模軟體加上外掛輸出而成,或是像我偷懶去網路上找現成的借用一下。

Collada Test Model Bank: https://collada.org/owl/
我沒研究這個地方的版權說明,總之,借用者別用作營利用途就好~

範例原始碼:


package
{
import away3dlite.core.base.Object3D;
import away3dlite.loaders.Collada;
import away3dlite.materials.WireframeMaterial;
import away3dlite.templates.BasicTemplate;

import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.URLLoader;
import flash.net.URLRequest;

[SWF(width=640, height=480)]
public class Away3DLite_TestCollada extends BasicTemplate
{
public function Away3DLite_TestCollada()
{
super();
}

private const ROTATION_DY_MAX:Number = 5;
private var rotation_dy:Number = 0;

private const ROTATION_DX_MAX:Number = 5;
private var rotation_dx:Number = 0;

private var _myCollada:Object3D

override protected function onInit():void{
camera.z = 0;
camera.zoom = 300;

view.mouseEnabled3D = false;

var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, onColladaLoaded);
loader.load(new URLRequest("collada.dae"));
}

private function onColladaLoaded(e:Event):void{
addColladaObj((e.currentTarget as URLLoader).data);

stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
stage.addEventListener(MouseEvent.MOUSE_WHEEL, onMouseWheel);
}

private function addColladaObj(data:*):void{
var collada:Collada = new Collada();
collada.material = new WireframeMaterial();
_myCollada = collada.parseGeometry(data);

scene.addChild(_myCollada);
}

private function onMouseMove(e:MouseEvent):void{
var dmx:Number = mouseX - width/2;
dmx = Math.min(Math.max(dmx, -width/2), width/2);
rotation_dy = ROTATION_DY_MAX * (dmx / (width/2));

var dmy:Number = mouseY - height/2;
dmy = Math.min(Math.max(dmy, -height/2), height/2);
rotation_dx = ROTATION_DX_MAX * (dmy / (height/2));
}

private function onMouseWheel(e:MouseEvent):void{
camera.z += (10 * e.delta);
camera.z = Math.min(camera.z, 0);
}

override protected function onPreRender():void{
if(_myCollada!=null){
_myCollada.rotationY += rotation_dy;
_myCollada.rotationX += rotation_dx;
}
}

}
}


載入 *.dae 後,可用滑鼠在畫面上移動,根據滑鼠 x, y 座標來使模型沿著 y 軸旋轉、x 軸旋轉,另外可用滑鼠滾輪控制 camera 的前進後退。

看效果:
http://sites.google.com/site/benrbchang/Away3DLite-Collada

2009年10月31日星期六

超過百場的 MAX 2009 研討會影片不容錯過

MAX 2009 ENVISION
http://tv.adobe.com/show/max-2009-envision/


MAX 2009 DEVELOP
http://tv.adobe.com/show/max-2009-develop/


MAX 2009 DESIGN
http://tv.adobe.com/show/max-2009-design/

2009年10月13日星期二

奧多比為全球 Flash 開發人員推出 iPhone 應用程式設計解決方案

MAX 2009 研討會搶先展示 Adobe Flash Professional CS5 Beta 嶄新 iPhone 應用程式輸出功能
【2009 年 10 月 13 日,台北訊】全球軟體大廠奧多比於 Adobe MAX 全球開發者研討會上宣佈新一代 Adobe Flash Professional CS5 將提供能製作豐富互動 iPhone 及 iPod Touch 應用程式的嶄新功能。Flash Professional CS5 公開測試版本預定於今年底前推出。在 MAX 專題展示中,奧多比搶先為全球開發人員說明如何應用 Flash Professional CS5 輸出 iPhone 應用程式,這項新功能運用的程式碼與 Flash 平台的執行時期(runtime)- Adobe AIR 及 Flash Player 10 相同,因此同樣可跨越各種平台與裝置傳遞應用程式。透過這項嶄新技術將讓全球數百萬設計及開發人員得以運用奧多比最受歡迎的 Flash 編譯工具進入 iPhone 應用程式的開發世界。
奧多比同時亦展示多款運用 Flash Professional CS5 測試版所製作的最新 iPhone 應用程式。目前已經開始運用測試版本進行 iPhone 應用程式設計的開發團體包括了BlueSkyNorth、Bowler Hat Games、Breakdesign、FlashGameLicense、Muchosmedia、PushButton Labs、South Park Digital Studios 及其他多家公司。奧多比同時宣佈有多項應用程式已遞交至 App Store 進行上架審核,其中包括奧多比網頁會議解決方案 - Adobe Acrobat Connect Pro 的 iPhone 應用程式。全球 iPhone 用戶可透過 Apple App Store 下載其中多款最新應用程式產品。如需更多相關資訊,請造訪 www.adobe.com/go/iphone。
Adobe Flash 平台技術能為設計及開發人員帶來更多嶄新商機,讓他們運用相同的程式碼輕鬆應對多樣化的作業系統及裝置環境。而為了協助開發人員進一步進入 iPhone 程式設計領域,Flash Professional CS5 測試版也計劃加入新的文字引擎(text engine),以提供更強大的創意自由度及文字控制功能;同時還有強化的團隊專案協同效能、即時增加互動效果的預設程式碼摘錄(code snippet)功能以及整合 Adobe Flash Builder 所提供的進階 ActionScript 編輯功能。如需更多 Flash Professional CS5 測試版相關資訊,請造訪 www.adobe.com/go/flashprobeta。
奧多比也於今日同步發表 Flash Player 10.1,新版將針對各種裝置提供一致的執行時期,並且已在 Open Screen Project 計劃中獲得近 50 家業界領導大廠的支持。這項由業界共同推動的標準計畫,將能讓消費者在各種裝置上得到一致且豐富的網際網路體驗。Flash Player 10.1 預定將陸續推出於一系列行動平台,包括Google Android、Blackberry、Symbian、Palm webOS 及 Windows Mobile。由於 Apple iPhone SDK 授權條款禁止執行程序直譯碼(runtime interpreted code),因此在蘋果電腦不支援的情況下,奧多比暫時無法在 iPhone 的 Safari 瀏覽器中提供Flash Player。然而透過 Adobe Flash Professional CS5 測試版所製作的 iPhone 應用程式,將不會包含任何執行程序直譯碼。
如欲觀賞奧多比於 Adobe MAX 展示為 Flash 開發人員推出 iPhone 應用程式設計解決方案的影片,請至 www.youtube.com/watch?v=rebv7iXKufw。
關於 Adobe Flash Platform
Adobe Flash Platform 是一項領先的網頁設計及開發平台,能創作設計極為出色的應用軟體、內容及影像,並能跨越最多樣的作業系統及裝置限制,同時已連結全球將近 98% 的連網電腦。其中 Flash Player 10 才剛宣佈推出10 個月,全球電腦下載安裝率即已突破 93%。根據comScore Media Metrix 的統計,目前全球有 75% 的線上影像內容,都是使用 Adobe Flash 技術來加以瀏覽與傳遞,因此 Flash 早已成為全球使用率第一的網路影像格式。全球各大傳媒企業,包括 Disney.com、MLB.com 及 DIRECTV,都使用 Adobe Flash 平台來傳遞影像內容;同時像是 YouTube 及 MySpace,也使用 Adobe Flash 平台技術來強化社交網路平台效能。如欲了解更多 Adobe Flash 平台相關技術,請造訪 www.adobe.com/flashplatform。
業界證言
Kevin Lynch - 奧多比技術長
「奧多比工程團隊成功為 iPhone 帶來最新的 Flash 技術應用,讓 Flash 開發社群得以全面進軍 App Store 市場。當有朝一日,蘋果電腦準備為 iPhone 用戶提供更完整的網頁瀏覽體驗時,我們也早已準備好將 Flash Player 支援效能帶入 Safari 瀏覽器。」
John Loiacono - 奧多比創意解決方案部門資深副總裁
「Adobe Creative Suite 是全球設計與開發人員都極為仰賴的創意工具,能夠應用於所有的內容及程式創作領域,為產品、品牌及概念帶來傑出創意。而這項嶄新的技術進展,則更將讓全球Flash開發者能夠充分運用既有的內容與專業知識,為 iPhone 領域帶來與 Flash 相容裝置同樣的使用體驗。」
Chris Petty - BlueskyNorth 公司溝通部門總監
「BlueskyNorth 是一家秉持傑出創意理念的設計公司,曾開發出多項贏得大獎並易於使用的應用程式產品。透過 Flash Professional CS5 測試版輸出製作 iPhone 應用程式的嶄新技術,我們將能更專注於現有的專業領域,並將既有的內容產品拓展推廣到 iPhone 用戶族群。」
Josh Tynjala - Bowler Hat Games 公司創辦人
「利用 Flash Professional CS5 測試版能夠製作 iPhone 應用程式的新功能,我們將不再需要煩惱是否應該學習新的程式設計語言或是其他開發工具。相對的,我們可以更為集中精力在如何研究開發更有趣的行動裝置遊戲,像是讓我們知名的 Chroma Circuit 遊戲能夠進軍 iPhone 市場,如此一來勢必更能大幅提升公司的營收領域。」


Stefan Wessels - Breakdesign 公司共同創辦人
「能轉換輸出現有的 Flash Lite 遊戲以及使用 Flash 技術開發新的 iPhone 休閒遊戲對我們來說無異是天大的好消息!像我們這樣的小型開發團隊,這是第一次無須繁雜的程式重新編寫流程,就能輕易為多種裝置平台開發行動遊戲的最佳選擇。」
Adam Schroeder - FlashGameLicense.com 共同創辦人
「Flash 網頁遊戲市場潛力驚人,而透過這項新的 Flash Professional CS5 測試版技術能讓開發人員可以運用既有的程式碼推出新產品,像是我們最近就積極投入由 DifferenceGames 所設計的 Red Hood 遊戲,並預備推出新的版本。Flash 是絕佳的休閒類遊戲平台,利用這項嶄新的技術,將更能為開發人員帶來巨大的商機拓展。」
Stefan Richter - Muchosmedia 創辦人
「我們非常興奮可使用既有的 Flash 技術投入 iPhone 開發,設計出更豐富且更具吸引力的多人應用程式。由於能直接在 Actionscript 3 進行設計,並且直接輸出成為 iPhone 與 iPod Touch 格式,因此我們公司最受歡迎的 Just Letters Game 這套遊戲,將能藉此拓展到新平台上,提供給更廣泛的市場大眾。」
Ben Garney - PushButton Labs 公司 Flash 平台資深開發人員
「使用 Flash Professional CS5 測試版製作 Trading Stuff In Outer Space 的 iPhone 版軟體實在讓我感到極為震撼!這項嶄新的工具非常容易上手使用 - 幾乎只要幾分鐘,就能將設計轉換為 iPhone 專用內容。奧多比一直希望能將 Flash 技術帶入 iPhone 領域,如今我們非常高興看到這項技術終於進入成熟運用階段。」
多媒體資訊
如欲了解如何使用 Flash Professional CS5 測試版開發 iPhone 程式,請造訪 www.adobe.com/go/iphone。
奧多比公司簡介
奧多比提供革命性技術,讓人們隨時隨地都能透過任何媒體,完美的利用創意、資訊與世界溝通。欲查詢更多詳細資料,請至奧多比公司主網站:www.adobe.com 或台灣分公司網站:www.adobe.com/tw。
※由頤德國際 (Veda International Corp.) 代表奧多比公司 (Adobe Systems) 發稿。

奧多比推出首款完全支援行動裝置與個人電腦的 Flash Player

將近 50 家 Open Screen Project 成員支援多平台運行的新瀏覽執行時期
【2009 年 10 月 13 日,台北訊】全球軟體大廠奧多比今日推出 Adobe Flash Player 10.1,此將支援智慧型手機、小型行動裝置(smartbooks)、小筆電、一般電腦以及其他連網裝置等,讓使用 Adobe Flash 平台製作的內容能隨時隨地連結目標族群。奧多比預計今年底前公開開發人員測試版本的瀏覽器版執行時期 (runtime),屆時將支援 Windows Mobile、Palm webOS 平台以及 Windows、Mac 與 Linux 等桌上型作業系統。而 Google Android 與 Symbian OS 的測試版執行時期預計將於 2010 年初推出。此外,Adobe 與 RIM 宣佈共同合作,將讓 Blackberry 智慧手機支援 Flash Player。同時 Google 亦宣佈加入 Open Screen Project 計劃 - 目前已將近 50 家業界領導廠商參與此計劃。
Flash Player 10.1 是 Open Screen Project 的首款執行時期,可在各種裝置間呈現一致的網路瀏覽體驗,如極為出色的應用程式、內容和 HD 高畫質影片。透過 Flash 平台的網路程式建置模組,瀏覽器版執行時期可讓數百萬設計及開發人員有效運用現有的程式碼與素材,降低在跨作業系統與瀏覽器間創作、測試和開發內容的成本。所有支援平台的 Flash Player 10.1 皆可輕易進行更新,確保即時支援各種創新應用,因應瞬息萬變的網路演進。
瀏覽器版執行時期可利用圖形處理器(GPU)運算能力加速影片和圖形的處理,大幅減少資源使用率,同時延長電池壽命。新版為行動裝置本身的功能特別強化,包含支援多點觸控、手勢控制、裝置輸入模組、加速感應與螢幕方向偵測,將為行動瀏覽體驗帶來超乎想像的創意操作與表現力。Flash Player 10.1 也特別提昇 HTTP Streaming 串流媒體傳輸能力,包含整合由 Adobe Flash Access 2.0 提供的內容保護能力。這項開發代碼為 Zeri 的 HTTP 技術將採用根據產業標準而設的開放格式,且將提供內容出版商、發佈商及產業夥伴所需的工具,使其可以更有效地利用 HTTP 基礎架構傳遞 Flash Player 10.1 與 Adobe AIR 2.0 軟體製作的高品質媒體。
欲知更多關於 Flash Player 10.1 的相關資訊與示範影片,請參訪 Adobe Labs(labs.adobe.com/technologies/flashplayer10/)。
「Flash Player 將邁向全新行動平台,使用者未來可隨時隨地完整體驗以 Flash 製作的網路內容或應用程式,」奧多比平台事業部副總裁暨總經理 David Wadhwani 表示:「我們很高興能廣泛與將近 50 家業界領導廠商共同參與 Open Screen Project 計劃,並與全球前 20 大手機製造商中的 19 家保持合作。我們非常期待明年上半年就能看到全球第一台完整支援 Flash Player 的行動裝置上市。」
Google 產品管理部副總裁 Sundar Pichai 表示:「我們非常興奮和 Adobe 與其他領導廠商一起加入Open Screen Project 計劃,這項計劃支持我們邁向共同目標,推動網際網路成為一個平台架構,並利用如 Adobe Flash 這樣的技術來促進產業創新。」
微軟產品管理部總經理 Stephanie Ferguson 說:「Adobe Flash 技術在全新 Windows Phone 上提供了關鍵體驗,讓使用者隨時隨地享受豐富的 Flash 遊戲、影片和其他互動網路內容。我們很期待在 Adobe Flash Player 10.1 正式推出後為 Windows Phone 瀏覽帶來更多嶄新功能。」
「摩托羅拉非常高興能在明年初成為最先推出首款支援 Flash Player 的 Android 手機製造商之一。」 摩托羅拉軟體平台與生態系統部副總裁 Cindy Wyatt 指出:「Flash 為網路上第一大影音平台,完整瀏覽 Flash 內容是豐富行動體驗中不可或缺的要件,也是用戶期望摩托羅拉今後可提供的服務。」
「身為奧多比長期的合作夥伴,以及現有出貨超過 400 萬部 Nokia 手機皆已支援Flash技術,我們非常期待 Flash Player 可以於更多手機與其他行動裝置運作,」諾基亞論壇副總裁 Purnima Kochikar 表示:「 Nokia 非常期待行動裝置上出現完整的 Flash Player,我們也保證 2010 年出貨的行種裝置一定會支援 Flash Player 10.1。」
Open Screen Project
由奧多比提倡的 Open Screen Project 計劃擁有將近 50 家業界領導廠商共同努力,目標在建立跨越行動電話、桌上電腦以及其他消費性電子裝置等的一致執行時期。這項活動旨在促使網路瀏覽和各種獨立應用程式皆可在廣泛的各式裝置上順暢執行,消弭各種阻礙以跨越不同螢幕限制,提供一致的內容和應用程式。共同參與這項計劃的廠商包含 Antena 3、Atlantic Records、ARM、BBC、Burda、Cell、中華電信、Cisco、Comcast、Conde Nast、Daum、Disney Interactive、Fox Mobile、Google、宏達電、Intel、LG Electronics、Lionsgate、Marvell、Motorola、MTV Networks、NBC Universal、Nokia、NTT DoCoMo、NVIDIA、OpenTV、Palm、Paramount、QNX Software Systems、Qualcomm、Stern.de、RIM、RTL、Samsung、Sony Ericsson、Texas Instruments 等。如欲了解 Open Screen Project的其他相關資訊,請至 www.openscreenproject.org。
關於 Adobe Flash 平台
Adobe Flash Platform 是一項領先的網頁設計及開發平台,能創作設計極為出色的應用軟體、內容及影像,並能跨越最多樣的作業系統及裝置限制,同時已連結全球將近 98% 的連網電腦。其中 Flash Player 10 才剛宣佈推出10 個月,全球電腦下載安裝率即已突破 93%。根據comScore Media Metrix 的統計,目前全球有 75% 的線上影像內容,都是使用 Adobe Flash 技術來加以瀏覽與傳遞,因此 Flash 早已成為全球使用率第一的網路影像格式。全球各大傳媒企業,包括 Disney.com、MLB.com 及 DIRECTV,都使用 Adobe Flash 平台來傳遞影像內容;同時像是 YouTube 及 MySpace,也使用 Adobe Flash 平台技術來強化社交網路平台效能。如欲了解更多 Adobe Flash 平台相關技術,請造訪 www.adobe.com/flashplatform。
奧多比公司簡介
奧多比提供革命性技術,讓人們隨時隨地都能透過任何媒體,完美的利用創意、資訊與世界溝通。欲查詢更多詳細資料,請至奧多比公司主網站:www.adobe.com 或台灣分公司網站:www.adobe.com/tw。
※由頤德國際 (Veda International Corp.) 代表奧多比公司 (Adobe Systems) 發稿。

Adobe Flash 平台加速跨桌上電腦及行動裝置的網路創新

將絕佳的網路瀏覽介面帶入最夯的行動裝置 讓工具創新精進設計開發流程
【2009 年 10 月 13 日,台北訊】全球軟體大廠奧多比於 Adobe MAX 全球開發人員大會上宣佈 Adobe Flash 平台諸多重要進展,以及揭曉 Flash Player 10.1,此將讓豐富網路內容、影音及應用程式觸及比以往更廣泛的各式裝置使用者。此外,奧多比也針對 Flash 平台的影音功能發表最新 HTTP 串流技術、展示 Adobe AIR 2 的嶄新功能,並推出 Adobe Flash Builder 及 Flash Catalyst 的 beta 2 測試版本,和全新 Adobe Flash 平台協同服務。
奧多比技術長 Kevin Lynch 表示:「我們非常興奮能在今年 Adobe MAX 大會上推出一系列 Flash 平台的最新工具版本。透過提供跨界工具、執行時期 (runtime)、服務內容及伺服器的快速創新,我們將協助整個產業中廣大且活躍的設計及開發人員利用豐富內容及應用程式促進網際網路發展。」
以同樣執行時期傳遞跨越桌上電腦及行動裝置的內容 不受限於瀏覽器架構
奧多比所推出的 Flash Player 10.1 提供跨桌上電腦及行動裝置的一致執行時期,並獲得近 50 家參與 Open Screen Project 的廠商支持。預計將支援 Flash Player 10.1 的行動平台包含 Google Android、Blackberry、Symbian、Palm webOS 及 Windows Mobile 等。
Adobe AIR 1.0 為提供瀏覽器外的網路應用所開發的 Flash 平台執行時期,自去年推出以來下載量已累積超過 2 億次。今年 MAX 大會上所介紹的 Adobe AIR 2 將可在桌面應用環境中建立全新的應用程式,提供開發人員更多桌面作業系統的優化功能,例如針對大量儲存裝置、點對點網路以及 UDP 網路的強化支援。Adobe AIR 2 beta 測試版本將於 2009 年底前問世。
提供點對點作業流程的開發工具 提高設計開發效能
透過 Adobe Flash Builder 與 Flash Catalyst,開發及設計人員能以更有效率的方式協同合作,開發豐富且具表現力的使用者經驗。根據開放原始碼 Flex 架構所開發的 Adobe Flash Builder,其新增的強大功能可快速實現豐富型網際網路應用程式 (rich Internet application; RIA) 建置,該 beta 2 測試版本目前已開放於 Adobe Labs 下載。beta 2 測試版本不但加強許多新的 Flash Builder 程式編輯及測試功能,而且簡化 Java 服務的連結並改善新版 Spark Flex 架構組件的運作能力,而這將為設計及開發人員提供更具生產效率的作業流程及完善的客製化豐富型網際網路應用程式。透過整合新版 LiveCycle Enterprise Suite 2,Flash Builder 允許開發人員更容易設計企業 RIA 及與企業系統連結。如欲了解更多 Adobe Flash Builder 相關資訊及下載 beta 2 測試版本,請至 www.adobe.com/go/flashbuilder4。
本次 MAX 大會奧多比也發佈Adobe Flash Catalyst beta 2 測試版本,此新版專業互動設計工具可輕易與開發流程結合,並讓設計人員在無須編寫程式碼的情況下即能迅速開發呈現介面及互動式內容。
其新版功能包括透過客製化播放控制器即可輕易將影音新增於專案中、為其他使用者的回饋增添音效,以及結合更簡易的控制功能,提供更順暢的動畫,並利用 Adobe AIR 及 SWF 輸出功能,匯出成可於瀏覽器外運作的作品。如欲了解更多 Adobe Flash Catalyst 的相關訊息及下載 beta 2 測試版本,請至 www.adobe.com/go/flashcatalyst。
Adobe Flash 平台與 Adobe Creative Suite 4 產品系列密切整合。Adobe Creative Suite 4 為業界領先的設計與開發軟體工具,能夠應用於所有的內容及程式創作領域。
可實現無縫式線上影音內容串流的伺服器平台
奧多比針對在 Flash 平台上的 HTTP 串流媒體傳輸推出新的通訊協定支援計劃,包含整合由 Flash Access 2.0 所提供的數位內容保護。開發代碼為 Zeri 的 HTTP 技術將採用根據產業標準而設的開放格式,且將提供內容出版商、發佈商及產業夥伴所需的工具,使其可以更有效地利用 HTTP 基礎架構傳遞 Flash Player 10.1 與 Adobe AIR 2.0 軟體製作的高品質媒體。客戶使用 Flash Media Server 3.5 不外乎因它能提供互動式媒體經驗、提升網路效率、以及具備智慧型快取技術和即時溝通功能,而現在這些用戶將具備使用 HTTP 串流技術的彈性,除將支援現今所有的媒體編碼,透過支援 Flash player 的適合影像傳輸速率及網路視訊錄影系統,Zeri 將持續支援高品質 Live 直播及錄製媒體內容。有了 Zeri 及 Flash Media Server 3.5 的加持,Flash 平台將提供新世代高品質數位媒體體驗。
實現即時協同合作的服務內容
甫於近期推出的 Adobe Flash 平台服務為一線上托管服務,提供開發人員透過一個可預測且符合成本效益的佈署模型,為網路應用程式增加創新功能。無論開發人員、廣告主或是內容出版商皆可透過 Adobe Flash 平台服務讓設計開發應用達成易於分享、符合社交網路需求及達成協同合作的目的。
奧多比在這次 MAX 大會宣佈為 Flash 平台服務加入新的協同服務,Adobe LiveCycle 協同服務(前身為 Adobe Flash 協同服務)提供開發人員及企業一套可協助他們在既有或新的網路應用中建立即時且多人的協同專案解決方案,以提高收益並提升顧客獲取率 (customer acquisition) 及掌握度。該托管服務由 Flash 平台及部分 LiveCycle Enterprise Suite 2 所提供,適用於連貫的協同開發作業,無須擔心全球佈署、維護及擴充的問題。
關於 Adobe Flash 平台
Adobe Flash Platform 是一項領先的網頁設計及開發平台,能創作設計極為出色的應用軟體、內容及影像,並能跨越最多樣的作業系統及裝置限制,同時已連結全球將近 98% 的連網電腦。其中 Flash Player 10 才剛宣佈推出10 個月,全球電腦下載安裝率即已突破 93%。根據comScore Media Metrix 的統計,目前全球有 75% 的線上影像內容,都是使用 Adobe Flash 技術來加以瀏覽與傳遞,因此 Flash 早已成為全球使用率第一的網路影像格式。全球各大傳媒企業,包括 Disney.com、MLB.com 及 DIRECTV,都使用 Adobe Flash 平台來傳遞影像內容;同時像是 YouTube 及 MySpace,也使用 Adobe Flash 平台技術來強化社交網路平台效能。如欲了解更多 Adobe Flash 平台相關技術,請造訪 www.adobe.com/flashplatform。
奧多比公司簡介
奧多比提供革命性技術,讓人們隨時隨地都能透過任何媒體,完美的利用創意、資訊與世界溝通。欲查詢更多詳細資料,請至奧多比公司主網站:www.adobe.com 或台灣分公司網站:www.adobe.com/tw。
※由頤德國際 (Veda International Corp.) 代表奧多比公司 (Adobe Systems) 發稿。

2009年10月7日星期三

Adobe Photoshop 教父級大師訪台 即將帶來 Russell Brown 秀

「創新的革命 Photoshop World 2009」於 11 月 4 日勁爆登場

【2009 年 10 月 7 日,台北訊】全球軟體大廠奧多比旗下 Adobe Photoshop 軟體自 1990 年推出後即顛覆了全世界對數位影像的想法,一直以來是攝影師與平面設計者不可或缺的必備工具,最新版本 Photoshop CS4 更是將影像一舉帶入 3D 的編修領域。奧多比 11 月 4 日將假台北紐約紐約典華信義會館舉辦「創新的革命 Photoshop World 2009」研討會活動,此次難得邀請到 Photoshop 催生者 - 奧多比資深行銷總監 Russell Brown 造訪台灣與使用者相見歡,同時帶來他最著名且獨一無二的「Russell Brown 秀」,Photoshop 在 1990 年即是靠「Russell Brown 秀」成功征服使用者的心,打下數位影像江山。精采活動勢必不容錯過,如欲親臨現場一睹 Photoshop 教父的風采,請至 www.myadobe.com.tw 報名,現場席次有限,前一百名完成報名者還可額外獲得 Adobe 限量紀念贈品,敬請提早卡位。

Adobe Photoshop 可說是當今世界上最暢銷的圖像編輯工具,這套建立許多業界領先標準的軟體最早是由 Knoll 兄弟於1987 年編寫而成,隨後在一次展示中,奧多比資深創意總監 Russell Brown 看到這程式的莫大潛力,進而促使 Photoshop 成為奧多比產品的一員。歷經多次產品革新,Adobe Photoshop 如今已是奧多比產品線中最重要的軟體之一。



Russell Brown 不僅是 Photoshop 的教父,對於 Photoshop 產品演進具諸多卓越貢獻, 他本身更是產品功能以外的最佳行銷利器,在 Photoshop 推廣初期即用幽默風趣的演繹方式讓使用者覺得 Photoshop 容易又好玩,進而讓軟體極短的時間內席捲市場。

Russell Brown 總是說:「學習 Adobe Photoshop 向來就不會是件枯燥無聊的事情」。

Russell 準備好最新銳的尖端技巧,將以他不可思議的 Photoshop 操作方式令現場大開眼界,並以融會貫通與充滿魅力的表演風格向現場來賓展示如何精準完成作品,並樂在其中。這次的「創新的革命 Photoshop World 2009」將帶領使用者一窺數位影像技巧與技術的嶄新未來。

關於 Adobe Photoshop World 2009 研討會

Adobe Photoshop World 2009 將於 11 月 4 日熱鬧登場,活動報名費用為新台幣 500 元整,參加者可獲得活動資料袋、中午餐盒與口譯機服務。此外,還將特別贈送市面上找不到、本活動專屬的「Russell Brown 秀」錦囊光碟一張,同時,當天只要填寫問卷即可加贈 Adobe CS4 時尚磁鐵組。

為感謝用戶的熱情參與,活動當天 Adobe 更大手筆提供價值十幾萬元的豐富抽獎獎項,包含 Photoshop CS4(建議售價 NT$ 39,290)、Photoshop CS4 Extended(建議售價 NT$ 56,130)與 Lightroom 2(建議售價 NT$ 16,030) 等,而購買 Adobe 產品者除可享現場特別優惠外,另可獲贈 Adobe CS4 紀念雨傘乙把。現場席次有限,機會難得,敬請提早卡位,如欲報名請至 www.myadobe.com.tw。

奧多比公司簡介

奧多比提供革命性技術,讓人們隨時隨地都能透過任何媒體,完美的利用創意、資訊與世界溝通。欲查詢更多詳細資料,請至奧多比公司主網站:www.adobe.com 或台灣分公司網站:www.adobe.com/tw。

※由頤德國際 (Veda International Corp.) 代表奧多比公司 (Adobe Systems) 發稿。

2009年10月6日星期二

TechCrunch Meetup Taipei

今晚參加 TechCrunch 在台北第一次舉辦的網聚,網聚目的主要是在於讓 TechCrunch 亞洲區編輯可以看看台灣有哪些新創公司或服務,共有六家公司報名參加簡報,也讓這些新創公司能有機會與網友們討論一些自家產品方面的問題。













主持人致詞

20091005 TechCrunch Meetup Taipei - 主持人 from Ben Chang on Vimeo.



TechCrunch 亞洲區編輯致詞

20091005 TechCrunch Meetup Taipei - 來賓 from Ben Chang on Vimeo.



http://starmugs.com/
以星巴克馬克杯為主題的社群,提供分享、交易資訊

20091005 TechCrunch Meetup Taipei - 第一組 from Ben Chang on Vimeo.



http://www.dragntalk.com/
網路簡報平台

20091005 TechCrunch Meetup Taipei - 第二組 from Ben Chang on Vimeo.



http://cloudonline.com.tw/
RSS Reader,可結合 Facebook,了解其他朋友的 RSS feed 收集

20091005 TechCrunch Meetup Taipei - 第三組 from Ben Chang on Vimeo.



http://www.citiport.net
網友提供旅遊景點資訊

20091005 TechCrunch Meetup Taipei - 第四組 from Ben Chang on Vimeo.



http://www.ragic.com/
以類似 Excel 的操作介面,讓使用者自行設計資料庫表單,不用撰寫程式、管理資料庫

20091005 TechCrunch Meetup Taipei - 第五組 from Ben Chang on Vimeo.



https://www.swagly.com/
網友替網友的照片中的物品提供資訊,若有人藉由此資訊購買到商品,則會分紅給提供資訊者

20091005 TechCrunch Meetup Taipei - 第六組 from Ben Chang on Vimeo.



http://www.ipevo.com.tw/
本次活動提供贊助,介紹過去已經上市的產品,以及十月份將有新的產品應用,WebCam 將配合軟體廠商實現擴增實境的應用

20091005 TechCrunch Meetup Taipei - IPEVO from Ben Chang on Vimeo.



因現場環境比較吵雜,所以收音品質不好之處,還請各位網友見諒。

2009年10月1日星期四

Flash IDE 的遮罩在 reparentting 後的問題

遇到一個問題,在 Flash IDE 中的時間軸上所設計的遮罩,若是用程式將他 reparentting 後,會導致在新的 container(該遮罩的parent) 中,所有 child index 在該遮罩之上的 display object,都會被該遮罩所遮到。

下圖是 UI 的配置,mask_mc 遮 contain_mc,在這組遮罩的上下各有一個 green_mc 與 blue_mc:



以下是程式碼,主要工作是建立一個新的 mc1 放到 MainTimeline 上,然後將 MainTimeline 上的所有 DisplayObject 都移進 mc1 中,並在動作前後都作一些 trace:


var mc1:MovieClip = new MovieClip();
mc1.name = "NewContainer";
addChild(mc1);

function traceInfo(container:DisplayObjectContainer):void{
trace("traceInfo()", container.name);
for(var i:int=0; i trace(i, container.getChildAt(i).name);
}
trace("");
}

trace("初始時的 MainTimeline");
traceInfo(this);

for(var i:int = numChildren-1; i>=0; i--){
var obj:DisplayObject = getChildAt(i);
if(obj!=mc1){
mc1.addChildAt(obj, 0);
}
}
_mc.getC
trace("reparentting 後的 MainTimeline");
traceInfo(this);

trace("reparentting 後的 NewContainer");
traceInfo(mc1);

var yellowLine:MovieClip = new YellowLine();
yellowLine.name = "yellowLine";
mc1.addChild(yellowLine);

trace("在 NewContainer 新加入 DisplayObject 後");
traceInfo(mc1);



執行後的畫面:



從第一段 trace 可以看出,在 Flash IDE 中所設計的遮罩,從 child index 來說,mask_mc (index=1) 會在 content_mc (index=2) 的下面。

第三、四段 trace 可以看出,所有 DisplayObject 在移動前後的 child index 都是沒有改變的,但是從畫面上來看,除了 blueLine (index=0) 之外的所有 DisplayObject 都會被 mask_mc 所遮蔽,即使是最後用程式加入的 yellowLine (index=4) 也不例外。

感覺上,Flash IDE 設計的遮罩,會將 child index 在其上面的 DisplayObject 都遮蔽,或許還會有一個變數來定義遮多少個(亂猜的),而當 reparentting 後為何會影響到所有在其上的物件,這點我還沒想出來。

正在研究 DisplayObject.mask 的相關說明,不過有可能 Flash IDE 設計的遮罩有不同的實作方式也說不一定。

2009年9月23日星期三

經濟部水利署發表以 Adobe Flex Builder 建立的新系統

讓水文水資源資料管理供應系統更加專業便捷
【2009 年 9 月 22 日,台北訊】全球軟體大廠奧多比今日宣布再添一 Adobe® Flash® 平台技術應用佳績!以提供技術服務、軟體工程、應用服務為主的地理資訊系統整合商銳俤科技,成功協助經濟部水利署「水文水資源資料管理供應系統」(http://gweb.wra.gov.tw/wrweb/) 的開發與升級,使其更具互動便利性。銳俤科技以 Adobe Flex® Builder™ 3 將現有複雜的水資源統計資料與空間數據轉化為可隨點即查的豐富型媒體系統,建立人性親和的系統介面。
新版「水文水資源資料管理供應系統」整合分散各級政府單位及公民營事業機構的水資源空間地理資料,建立完整水文水資源資料倉儲中心,並提高水資源資訊互通共享,以及全面提昇國內水資源規劃、管理、決策能力。這項結合 Adobe Flash 平台與地理資訊系統技術的整合模式為產業設下全新典範,亦在水利署的專案評比驗收中獲得專家學者高度肯定。
「現在幾乎所有連網電腦都已安裝 Flash Player,對用戶而言,新系統最大的優勢在於不需額外安裝他們不熟悉的元件。」銳俤科技 GIS 事業部環境資源業務處處長張志誠表示:「在 Flash 平台普及的優勢條件下,無論是一般用戶或專案客戶都能毫無顧慮地立即串連存取資料庫訊息。其他跨平台開發環境都有其限制,無法擔保用戶是否願意使用特定資訊格式。而架構在Flash環境就無須擔心此一問題,開發人員只要設計單一內容架構,就能立即無礙地執行於所有平台系統環境。」
Adobe Flex Builder 程式開發工具能智慧型編碼,交互式程式除錯,並以視覺化設計使用者介面排版、外觀與豐富型網際網路應用(RIA)。Adobe Flex Builder 亦內建多樣化的元件資料庫內容與模組設計,開發人員直接就能套用於各種系統設計需求,大幅度縮短專案開發時程,節省更多寶貴時間及人力。
水利署的「水文水資源資料管理供應系統」長期以來累積匯集了極為龐大的純文字資料庫內容,近年已對應用效率造成某種程度的影響。為滿足日漸豐富多樣化的資料格式,銳俤科技運用 Adobe Flex Builder 整合地圖開發與多媒體內容,以動靜態複合地圖技術(Hybrid Map)全面提升地理資訊系統,成功打造極具互動性的系統資料庫人機介面,與更順暢的地理資訊系統顯示效能。銳俤科技使用 Adobe Flex Builder 建立的地理資訊系統與其他線上資料庫的網路服務,讓新系統得以透過 Adobe Flash 平台毫無障礙地於所有作業系統及瀏覽器提供一致性的服務。
有鑑於成功以 Adobe Flash 平台技術佈署和改良水利署水文水資源資料管理供應系統,銳俤科技有信心將擁有豐富開放資源的 Adobe Flash 平台作為公司首選開發工具。
奧多比公司簡介
奧多比提供革命性技術,讓人們隨時隨地都能透過任何媒體,完美的利用創意、資訊與世界溝通。欲查詢更多詳細資料,請至奧多比公司主網站:www.adobe.com 或台灣分公司網站:www.adobe.com/tw。
※由頤德國際 (Veda International Corp.) 代表奧多比公司 (Adobe Systems) 發稿。

2009年9月18日星期五

酷炫新SHOW開發創意大賽

Show出創意 打造夢想 豐富人生
酷炫新Show開發創意大賽是針對手機娛樂領域開發者所舉辦的大賽,由Sony Ericsson 開發者世界 主辦,大會宗旨在提升在校大學生手機領域學習者和廣大在校手機玩家的創新性與積極性,提供展現自我的創意舞台,打造參賽者未來職場生涯之路。

見證奇蹟 由此開始
Sony Ericsson開發者世界尊重每位參賽者的原創性,更重視每份參賽作品的用心﹔
獲獎者即可優先獲得Sony Ericsson北京總部研發中心的實習機會;
只是參賽”入圍者”皆可獲得Sony Ericsson開發者世界的榮譽證書;
所有入圍作品皆有機會與Sony Ericsson PlaynowTM合作,打造屬於自已的酷炫手機!


參賽得獎者皆可得到優渥的獎學金和Sony Ericsson的手機
誘人的大獎正在向你招手 還在等什麼 加快腳步動起來吧!

詳情請參閱活動網站
http://developer.sonyericsson.com/universityawards

活動專線:02-2516-1255#108
作品繳交期間: 2009年7月-10月20日

2009年9月15日星期二

奧多比宣佈 2009 亞太地區學校創意大獎起跑

首屆競賽鼓勵亞太地區學生盡情揮灑絕佳創意

【2009 年 9 月 15 日,台北訊】全球軟體大廠奧多比今日宣佈第一屆 Adobe 亞太地區學校創意大獎將從 2009 年 9 月 15 日開始接受報名,這項大賽將開放給台灣、澳洲、香港、印度、印尼、中國、南韓、馬來西亞、菲律賓、新加坡、泰國以及紐西蘭等地,邀請這些地區 14 至 19 歲的年輕學子參加,為該區最令人激賞的年輕創意心靈提供舞台,不但在廣大觀眾前展現才華,同時也有機會獲得肯定並贏得誘人獎項。

奧多比致力深耕教育市場,長期以來更是不間斷地支持與鼓勵學子們在創意上的表現。藉由本次 Adobe 亞太校園創意大獎,奧多比期待能更擴大其對亞太地區青年朋友的貢獻。

奧多比亞太區教育推廣總監 John Treloar 表示:「奧多比一直以來努力啟發年輕人的創意天賦,並鼓勵他們藉由數位媒體工具來表現自己。2009 Adobe 亞太校園創意大獎正是個絕佳機會,提供舞台讓這些優秀的學子們表現才華並獲得肯定!」

這場競賽鼓勵學生們探索現今影響這個世界的議題,同時讓他們自由展現創意。學生們能以個人身分或組隊報名,從主辦單位所訂的三項類別及三種主題中選擇參加。競賽類別包含:

· 網頁設計或開發 — 可用於參賽的作品包含:網頁、部落格、互動式CD/DVD、網頁動畫、教學物件、行動設計…等。

· 視訊與影片 — 可用於參賽的作品包含:真人動畫、紀錄片、短片、動態繪圖、動畫影片、政令宣導…等。

· 美工與平面設計 — 可用於參賽的作品包含:繪圖作品、明信片、標誌、標籤、包裝、攝影作品、年鑑、廣告、雜誌、海報、文宣品/手冊、書籍、電子報…等。

這次的競賽主題包含:

· 環保 — 保護自然資源,例如水資源和能源,降低浪費,並使人類對環境的影響最小化。

· 法律 — 宣傳使用合法軟體。

· 其他任何主題 — 開放學生以自選主題參賽。

優勝者選拔與獎勵

奧多比將在各類別中選出 2 名決賽入圍者和 1 名得獎者,並另外選出 1 名金獎得主。冠軍得主與入圍者將由奧多比評審團遴選。

· 類別得獎者 — 類別優勝者將可獲得 Adobe Creative Suite 4 Master Collection 軟體與得獎證明乙紙。

· 決賽入圍者 — 個人決賽入圍者將可選擇獲得 Adobe Creative Suite 4 Design Premium、Web Premium 或 Production Premium 軟體,以及入圍證明乙紙。團體決賽入圍者的每位成員將可選擇獲得以下任一項軟體: Adobe Premiere Pro CS4、After Effects CS4、Adobe InDesign CS4、Adobe Photoshop CS4、Adobe Dreamweaver CS4 或 Adobe Flash CS4 Professional ,以及入圍證明乙紙。

· 金獎得主 — 金獎得主將可獲得得獎證明乙紙與筆記型電腦乙台(可選擇 Hewlett Packard Pavilion dv3600 或 Apple MacBook Pro 13 吋)。

· 教師 — 每個類別得獎者的指導老師將會獲得Adobe Creative Suite 4 Master Collection 軟體乙套。

· 學校 — 金獎得主的學校將獲得 30 份授權的 Adobe Creative Suite 4 Master Collection 軟體,供學校資訊教室 30 台電腦使用。

Adobe 將於 2009 年 9 月 15 日開始線上收件,提交期限為 2009 年 12 月 15 日。得獎者將於 2010 年 1 月 31 日之前公布,並以電子郵件通知。如需有關參賽類別、獎項和參賽要求的資訊,請參閱以下網站的官方規則 http://www.adobe-eduapac.com/award。

奧多比公司簡介

奧多比提供革命性技術,讓人們隨時隨地都能透過任何媒體,完美的利用創意、資訊與世界溝通。欲查詢更多詳細資料,請至奧多比公司主網站:www.adobe.com 或台灣分公司網站:www.adobe.com/tw。

※由頤德國際 (Veda International Corp.) 代表奧多比公司 (Adobe Systems) 發稿。

2009年8月26日星期三

奧多比與巨匠電腦密切合作培育優異創意設計人才

營造卓越教學成果 贏得學員及業界一致肯定

【2009 年 8 月 26 日,台北訊】全球軟體大廠奧多比與國內頂尖數位教學機構巨匠電腦鑑於日益增加的專業設計需求,共同聯手推動國內創意產業人才培育。巨匠電腦經與奧多比密切合作,建立、累積相當豐富的學習資源,諸如優質課程教材、頂尖技術交流和教師培訓等。此外,巨匠電腦也推出隨專業設計課程附贈 Adobe 教育版軟體計劃及 Adobe Certified Associate (ACA) 國際認證培訓課程,同時並積極舉辦相關美學講座及設計競賽,提供學員與國內設計界廣泛的交流空間,卓越成果贏得學員一致肯定。

「數位設計創意學習市場在台灣的需求越來越高,這已是十年來的趨勢。由於台灣在創意設計的成果全球有目共睹,同時各大專院校也紛紛設立設計相關科系,都是造就人才及市場需求不斷提升的主因。」巨匠電腦總經理黃志聰表示:「其中奧多比數位創意解決方案更是台灣設計市場的學習主流,課程設計以奧多比各項軟體產品為核心,才能讓學員汲取滿足就業市場需求的必備技能。巨匠電腦從早期 Photoshop 平面設計學習課程,陸續引進網頁設計學習,如 Flash 及 Dreamweaver 等熱門潮流技術,讓課程規劃得以貼近市場需求脈動。當奧多比發表 Adobe Creative Suite系列軟體後,巨匠電腦更積極導入由平面到動態的一連貫創意學習課程。」

在巨匠電腦報名奧多比相關設計課程的學員人數近年不斷提昇,去年已累積近三萬名學生參與,與2007年同期相較成長率超過 15%。「為讓學生有更好的學習成效,上課時間外也能在家練習軟體操作,巨匠電腦推出隨課程附贈Adobe教育版軟體的超值方案,」黃志聰補充說明:「身為創意產業中的領導廠商,奧多比所推出的軟體長久以來深獲設計領域專業人士的擁戴,而我們也會盡可能地幫學員做好投身該領域的一切準備。」

巨匠電腦於 2008 年 7 月啟動 ACA 認證課程計劃,並培訓專業講師熟悉相關作業,同年 11 月完成認證中心建置。ACA 認證乃是奧多比第一張國際中文版認證,並獲 ISTE 國際科技教育學會承認,認證內容著重多媒體網頁設計、數位內容及媒體傳播的核心應用能力、知識與技術。巨匠電腦成立 ACA 認證考試中心有助於推廣設計領域的證照制度,對學員投入職場或產業評估人才標準皆有非常正面的助益。

巨匠電腦在強化軟體教學技巧之餘,也著眼於提升學員的創意概念,為此近年來每年屢邀業界攝影大師及網路創意界知名人士舉辦各種美學講座及創意競賽。巨匠電腦深耕國內數位創意學習市場的努力及卓然成果,可說是業界有目共睹的優異典範!

奧多比公司簡介

奧多比提供革命性技術,讓人們隨時隨地都能透過任何媒體,完美的利用創意、資訊與世界溝通。欲查詢更多詳細資料,請至奧多比公司主網站:www.adobe.com 或台灣分公司網站:www.adobe.com/tw。

巨匠電腦簡介

巨匠電腦教育中心以「專業、服務、實在」的理念致力於電腦教育二十三年,已自創本身優質的本土教學品牌, 也是目前全國分校最多的電腦教育中心。

※由頤德國際 (Veda International Corp.) 代表奧多比公司 (Adobe Systems) 發稿。

2009年8月25日星期二

Adobe MAX 2009

2009年8月7日星期五

ActionScript 3.0 Image Effects

颱風天在家裡,甚麼事情也不能做,更扯的是餐城也進不去,詭異的是我老婆可以...$%&@#,這時候只能暗自猜想 playfish 該不會將我的電腦變成拒絕往來戶了吧。既然沒有遊戲可以玩,只好趁機花點時間再繼續看看之前買的書:

ActionScript 3.0 Image Effects
http://tlsj.tenlong.com.tw/WebModule/BookSearch/bookSearchViewAction.do?isbn=1430218711&sid=50458



本書的章節如下:

1. The Drawing API

無廢話,直接快速帶過常用的 API 語法。甚至會提到 Flash Player 10 才支援的語法,譬如 Graphics 的:

copyFrom(sourceGraphics:Graphics):void
Copies all of drawing commands from the source Graphics object into the calling Graphics object.

lineBitmapStyle(bitmap:BitmapData, matrix:Matrix = null, repeat:Boolean = true, smooth:Boolean = false):void
Specifies a bitmap to use for the line stroke when drawing lines.

drawTriangles(vertices:Vector.<Number>, indices:Vector.<int> = null, uvtData:Vector.<Number> = null, culling:String = "none"):void
Renders a set of triangles, typically to distort bitmaps and give them a three-dimensional appearance.

"繪製命令" 本身也可以被當作物件來操作、管理,那要做 undo 應該就會更容易些。還有像是使用 BitmapData 當作畫線的素材,這也是之前所沒有的。至於繪製三角形組的語法,若是搭配 BitmapData 填圖的話,那就可以用來實作 3D 貼圖的效果。


2. Filters and Blend Modes

介紹大部分的 Filter 與 Blend Modes,與其他書本類似。

會提到類似這篇文章的內容:http://blog.ben.idv.tw/2008/09/convolutionfilter.html

3. Bitmaps and BitmapData

談到點陣圖、像素、位元等等的基本知識。加上搭配 ColorTransform 做一些特效變化。


4. Advanced Bitmap Manipulation

談到 BitmapData.noise()、perlinNoise()、copyChannel(),還有像是數位相機常會提供影像光譜資訊的功能:

Computes a 256-value binary number histogram of a BitmapData object.

接著會提到 threshold(),也就是我們會用來做 webcam 動態偵測時所需要的功能:http://blog.ben.idv.tw/2008/08/webcam.html
甚至可以用來做動態去背的機制。

另外也會再多談到幾個 photoshop 中所提供的功能 要如何用 AS3 做到。

5. Pixel Bender and Shaders

帶過 Pixel Bender Toolkit 的使用,想當然不會離題太遠而提到 Pixel Bender language 的語法,然後接著就是在 AS3 中如何使用 Shader 載入 *.pbj,以及如何在 AS3 中提供 kernel 所需的參數。

6. ActionScript in the Third Dimension

很有用的章節,會先將 2.5D 解釋完,然後用一點點簡單的範例說明。

談到用 Vector3D、Matrix3D 來對每個 3D 座標作位移、距離計算等等。

因為 3D 的 z,跟實際上每個 DisplayObject 被加進 Display List 的順序所造成的 Depth 不同,所以需要 Transform 類別新加的方法來處理以計算每個 3D 的 z 換成 2D 後的大小:

Returns a Matrix3D object, which can transform the space of a specified display object in relation to the current display object's space.

然後再進行排序,以決定重新加入 Display List 的順序。

最後會提到以 BitmapData 進行 3D 貼圖的做法,也會用到 drawTriangles() 來完成。

這章節,提到不少小型 3D Engine 原理。

7. Using an Animation and Effect Library

使用以下兩組 library:

比較特別的是,他有支援複合式動畫、特效的機制,使用了 Composite 設計模式,可用來製作連續動畫,將多個動畫組合起來做 連續 或 同時 播放。






以下章節還沒閱讀到,不過相信也會很精彩

8. Elemental Animation Effects
9. Text Effects
10. Video Effects
11. Sound Visualization Effects
12. Interactive Effects



非常值得推薦給需要做影像處理、特效的開發者閱讀,或是一些網路活動要針對 webcam 拍照後做特效的機制,也都可以參考本書的範例程式。




最後,補充一點,以上我貼的語法說明,是從 adobe 官網貼來的,若你手邊的 Help 檔是 Flash CS3 的話,那是不夠的,因為只支援到 Flash Player 9,一定要找有支援到 Flash Player 10 的新版 Help 才行,譬如 Flex 3.3 的 Help:



2009年8月6日星期四

初探 pureMVC

最近突然感覺身邊的人都在談 pureMVC,這個 framework 的目的是為了讓我們的程式功能切分乾淨:

Model 儲存資料
View 視覺、畫面
Controller 邏輯、流程控制

配合這三個基本元素,有著以下三個負責 "做事情" 的傢伙:

Proxy 負責存取 Model 的資料、取得外部資料...等
Mediator 負責對 View 作改變,以及監聽 View 的事件
Command 在 Controller 中的角色,是實作你商業邏輯的地方

而要讓這三方能 "認識" 彼此,就靠唯一的 Facade;若想要 "通知" 彼此的話,就必須送出 Notification,會由有興趣的人 收到通知後 進行後續的工作。

以上的概念,只要認識下面這張圖就可以了:



先對每個角色的 "位置" 有個瞭解,至於它們之間的那些 "箭頭" 表示著互通有無的關係,那就看不同的專案、每個人的經驗,來決定實務上的作法(誰可以與誰有互動),當然最好是越單純越好,別因為大家都可以透過 Facade 取得彼此而亂來。

以下,我作一個超陽春簡單的範例:

pureMVC_Test1.as

程式進入點,在這個程式中,我進行 UI 的建立,若是你的 UI 是 Flash(*.fla) 製作,或是 Flex Builder(*.mxml) 的話,就不用像我這樣寫一堆瑣碎的程式碼。

取得 ApplicationFacade 後,透過 init() 開始進行一連串的工作。


package {
import flash.display.SimpleButton;
import flash.display.Sprite;
import flash.text.TextField;
import flash.text.TextFieldType;

import idv.ben.test1.ApplicationFacade;

public class pureMVC_Test1 extends Sprite
{
public var txtSearch:TextField; //輸入搜尋字串的文字欄位
public var btnSearch:SimpleButton; //搜尋按鈕
public var txtResult:TextField; //顯示搜尋結果的文字欄位

public function pureMVC_Test1()
{
//初始化 UI
initComponents();

//開始叫 pureMVC 工作了
ApplicationFacade.getInstance().init(this);
}

/**
* 本範例的 UI 完全由程式產生,所以以下會有比較瑣碎的 UI 建立
*
*/
private function initComponents():void{
txtSearch = new TextField();
txtSearch.type = TextFieldType.INPUT;
txtSearch.border = true;
txtSearch.x = 100;
txtSearch.y = 50;
txtSearch.width = 200;
txtSearch.height = 20;
this.addChild(txtSearch);

var spriteBtn:Sprite = new Sprite();
spriteBtn.graphics.beginFill(0x999999);
spriteBtn.graphics.drawRect(0, 0, 100, 20);
spriteBtn.graphics.endFill();
var txtBtn:TextField = new TextField();
txtBtn.text = "SEARCH";
txtBtn.width = 100;
txtBtn.height = 20;
spriteBtn.addChild(txtBtn);
btnSearch = new SimpleButton(spriteBtn, spriteBtn, spriteBtn, spriteBtn);
btnSearch.x = 100;
btnSearch.y = 100;
this.addChild(btnSearch);

txtResult = new TextField();
txtResult.type = TextFieldType.DYNAMIC;
txtResult.border = true;
txtResult.x = 100;
txtResult.y = 150;
txtResult.width = 200;
txtResult.height = 20;
this.addChild(txtResult);
}
}
}


ApplicationFacade.as

定義了一堆 Notification 名稱。

註冊第一個 Command,以及送出 Notification 以觸發該 Command 執行。(其實背後還包含了 Facade 去 View 中,用 Notification 找是否有對應的 Observer,才找到事先註冊的 Command)


package idv.ben.test1
{
import idv.ben.test1.controller.InitCommand;

import org.puremvc.as3.interfaces.IFacade;
import org.puremvc.as3.patterns.facade.Facade;

public class ApplicationFacade extends Facade implements IFacade
{
static public const NOTIFICATION_INIT:String = "NOTIFICATION_INIT";
static public const NOTIFICATION_INITED:String = "NOTIFICATION_INITED";

static public const NOTIFICATION_SEARCH:String = "NOTIFICATION_SEARCH";
static public const NOTIFICATION_RESULT:String = "NOTIFICATION_RESULT";

static public function getInstance():ApplicationFacade{
if(instance==null)
instance = new ApplicationFacade();
return ApplicationFacade(instance);
}

/**
* 當建立 Facade 過程中,要取得 Controller 時,會有機會讓開發者可以定義一些有的沒的
*
*/
override protected function initializeController():void{
super.initializeController();

//註冊 當 NOTIFICATION_INIT 發生時,由 InitCommand 類別來處理
this.registerCommand(NOTIFICATION_INIT, InitCommand);
}

/**
* 開始工作
* @param app
*
*/
public function init(app:pureMVC_Test1):void{
//通知 發生 NOTIFICATION_INIT
this.sendNotification(NOTIFICATION_INIT, app);
}
}
}


InitCommand.as

被通知而執行 execute() 後,可以作一些其他初始化的工作,像是設定哪些 View 要由哪些 Mediator 來管理,又有哪些 Notification 可能發生,發生時要由哪個 Command 處理...等等。

作完後,再送一個 Notification 出來,這裡我用的是 NOTIFICATION_INITED。


package idv.ben.test1.controller
{
import idv.ben.test1.ApplicationFacade;
import idv.ben.test1.model.DataProxy;
import idv.ben.test1.view.MainMediator;

import org.puremvc.as3.interfaces.ICommand;
import org.puremvc.as3.interfaces.INotification;
import org.puremvc.as3.patterns.command.SimpleCommand;

public class InitCommand extends SimpleCommand implements ICommand
{
public function InitCommand()
{
super();
}

override public function execute(notification:INotification):void
{
//註冊 儲存資料的物件
this.facade.registerProxy(new DataProxy());

//註冊 指定的UI 是由哪個 Mediator 負責管理
var app:pureMVC_Test1 = pureMVC_Test1(notification.getBody());
this.facade.registerMediator(new MainMediator(app));

//註冊 當 NOTIFICATION_SEARCH 發生時,由 SearchCommand 類別來處理
this.facade.registerCommand(ApplicationFacade.NOTIFICATION_SEARCH, SearchCommand);

//通知 發生 NOTIFICATION_INITED
this.facade.sendNotification(ApplicationFacade.NOTIFICATION_INITED);
}

}
}


若是你這時候發現,在 InitCommand 中,沒有看到我註冊負責處理 NOTIFICATION_INITED 這個 Notification 的 Command,在 ApplicationFacade 中也沒,那是誰會做對應的動作?那就繼續來看看 MainMediator.as 吧!

MainMediator.as

會 override listNotificationInterests(),目的是當他被註冊時,會要告訴 View 自己關心哪些 Notification,這樣一來當 View 要分派 Notification 時就會通知道這個 Mediator 了。

於是在 handleNotification() 中,就可以收到 NOTIFICATION_INITED 並進行一些作業。這裡我會進行畫面 UI 元素的事件監聽程式,當按下搜尋按鈕時要送出 NOTIFICATION_SEARCH 通知,將欲搜尋的關鍵字一同送出。


package idv.ben.test1.view
{
import flash.events.MouseEvent;

import idv.ben.test1.ApplicationFacade;
import idv.ben.test1.model.DataProxy;

import org.puremvc.as3.interfaces.IMediator;
import org.puremvc.as3.interfaces.INotification;
import org.puremvc.as3.patterns.mediator.Mediator;

public class MainMediator extends Mediator implements IMediator
{
static private const MEDIATOR_NAME:String = "MainMediator";

private var dataProxy:DataProxy;

private function get app():pureMVC_Test1{
return pureMVC_Test1(this.viewComponent);
}

public function MainMediator(viewComponent:Object=null)
{
super(MEDIATOR_NAME, viewComponent);

//記住負責儲存資料的物件是誰
dataProxy = DataProxy(this.facade.retrieveProxy(DataProxy.PROXY_NAME));
}

/**
* 此 Mediator 關心哪些 Notification
* @return
*
*/
override public function listNotificationInterests():Array{
return [ApplicationFacade.NOTIFICATION_INITED
, ApplicationFacade.NOTIFICATION_RESULT];
}

/**
* 當此 Mediator 關心的 Notification 發生時,分別要做哪些工作
* @param notification
*
*/
override public function handleNotification(notification:INotification):void{
switch(notification.getName()){
case ApplicationFacade.NOTIFICATION_INITED:
onNotify_inited(notification);
break;
case ApplicationFacade.NOTIFICATION_RESULT:
onNotify_result(notification);
break;
}
}

/**
* Facade 初始化完成時
*
*/
private function onNotify_inited(notification:INotification):void{
setListener(true);
}

/**
* 搜尋得到結果時
*
*/
private function onNotify_result(notification:INotification):void{
//從 Notification 中取得搜尋結果
app.txtResult.text = notification.getBody()["result"];
}

/**
* 設定UI的事件處理
* @param tf
*
*/
private function setListener(tf:Boolean):void{
if(tf){
app.btnSearch.addEventListener(MouseEvent.CLICK, onBtnSearchClick);
}else{
app.btnSearch.removeEventListener(MouseEvent.CLICK, onBtnSearchClick);
}
}

/**
* 按下搜尋按鈕時
* @param e
*
*/
private function onBtnSearchClick(e:MouseEvent):void{
var body:Object = {};
body["keyword"] = app.txtSearch.text;

//通知 發生 NOTIFICATION_SEARCH,並且將搜尋字串夾帶在 Notification 中
this.facade.sendNotification(ApplicationFacade.NOTIFICATION_SEARCH, body);
}

}
}


回頭看看 InitCommand 中所設定的,當 NOTIFICATION_SEARCH 發生時,會由 SearchCommand 來負責處理。

SearchCommand.as

負責請 DataProxy 進行資料存取,不管該資料是來自內部或外部,反正 DataProxy 會負責搞定。


package idv.ben.test1.controller
{
import idv.ben.test1.model.DataProxy;

import org.puremvc.as3.interfaces.ICommand;
import org.puremvc.as3.interfaces.INotification;
import org.puremvc.as3.patterns.command.SimpleCommand;

public class SearchCommand extends SimpleCommand implements ICommand
{
public function SearchCommand()
{
super();
}

override public function execute(notification:INotification):void
{
//由 Notification 中可以取得搜尋字串
var searchString:String = notification.getBody()["keyword"];

//開始搜尋
search(searchString);
}

private function search(searchString:String):void{

//透過 DataProxy 進行查詢
var dataProxy:DataProxy = DataProxy(this.facade.retrieveProxy(DataProxy.PROXY_NAME));
dataProxy.search(searchString);
}
}
}


DataProxy.as

可針對寫在程式碼中的資料作一些存取,或是向外部資源要求資料。這裡我為了測試方便,直接模擬查詢結果是現在時刻的字串。

通知 NOTIFICATION_RESULT 發生。


package idv.ben.test1.model
{
import idv.ben.test1.ApplicationFacade;

import org.puremvc.as3.interfaces.IProxy;
import org.puremvc.as3.patterns.proxy.Proxy;

public class DataProxy extends Proxy implements IProxy
{
static public const PROXY_NAME:String = "DataProxy";

public function DataProxy()
{
super(PROXY_NAME, "");
}

public function search(searchString:String):void{
//假設搜尋結果是此刻時間
var result:String = (new Date()).toString();

//通知 發生 NOTIFICATION_RESULT
var body:Object = {};
body["result"] = result;

this.facade.sendNotification(ApplicationFacade.NOTIFICATION_RESULT, body);
}


}
}


DataProxy 只負責資料存取,不用理會查到的資料要給誰用。

這時候我們可以回到 MainMediator 看看 listNotificationInterests() 中,MainMediator 對 NOTIFICATION_RESULT 也有興趣,所以 View 就會通知 MainMediator 更新畫面。



以上,總之,每個角色只顧好自己的工作,然後通知 Facade 發生了哪些 Notification,之後自然會有事先註冊好的 Command 或 Mediator 會去執行作業。

2009年7月18日星期六

台灣 Adobe 第一屆部落客聚會

今天晚上台灣 Adobe 舉辦第一屆部落客聚會,一些老朋友如 Brian、火星人、阿修、Ticore、小正正、Maso、Erin、奶綠...等人,都有受邀參加。



主人有準備俗稱 "天使之鈴" 的法國小點心,那是一種外殼脆脆硬硬的,咬破後裡面很鬆軟,但又沒有小林煎餅的吊鐘燒那麼軟,仍帶有蛋糕蓬鬆的口感。





開場白由台灣區的頭頭 Will 做介紹,有位網友當場問了他一個問題:這場聚會的主要目的?未來是否有更多的聯繫(Adobe 與使用者)?不過,不知道是我實在不太專心,或是 Will 也沒回答出甚麼有具體明確的答案,我印象中這次的聚會還是純粹將大家聚一聚、哈拉一下罷了。



Adobe User Group 的老朋友們很久沒見了,也藉著這次機會可以聚聚聊聊。



行銷經理-法蘭 有帶著各部落客參觀辦公室,以下是參觀影片:

台灣Adobe第一屆部落客聚會 from Ben Chang on Vimeo.

2009年6月27日星期六

Web 版世紀帝國:Evony

這兩天在玩 Evony (http://www.evony.com/),其實注意到這個遊戲已經很久了,因為最近在各個 Google Reader 中訂閱的 RSS 中,不斷出現他的廣告,所以我終於禁不住好奇加入玩玩看。

這是一款 Web 版的多人線上遊戲,遊戲內容類似世紀帝國的模式,打造自己的國家、採集資源、攻城掠地等等。有意思的是,你不用一值待在電腦前面,只要稍做設定 (建造、生產...),即使你關掉瀏覽器離開網站,伺服器也仍會依照實際時間來完成你所設定的工作。

像這類的遊戲,還有以下幾個:

Travian (http://www.travian.tw/)

IKARIAM (http://www.ikariam.tw/)

回到 Evony,以下有些截圖:

城鎮中,可建造多種不同功能的建築物,主要的政治、行政作業,都是在市政中心處理:


學院,可學習各種工程技術,以加速各種作業的速度:


兵營,可在此開始雇用不同種類的傭兵:


城鎮外,建立四種不同資源的採集場,每次升級都需要不同的資源數量才行:


世界地圖,可以看到玩家城市周邊的其他地形,或其他玩家的城市,可決定是否要探索或攻城掠地:


左下角有些功能面板,其中最常需要開啟瀏覽的就是任務面板,初期的目標就是仰賴不斷的完成任務來獲得不同的資源:


玩家也可以從統計表中看到自己在所在伺服器中的排名,也包括了聲望值與人口數等,不過統計表中的數值與玩家右邊的面板資料有點不太同步:


從統計表來看,共有 10 筆 x 4631 頁 = 約 46300 個玩家,而我才玩一天多一點,已經達到前 20 名了,遊戲過程中不斷會有玩家詢問:"how to play?",可見得玩到一半就放棄的人應該佔大多數吧!

2009年6月22日星期一

TypeError: Error #1007: 嘗試個體化非建構函式。

前兩天遇到一個非常詭異的錯誤訊息:

"TypeError: Error #1007: 嘗試個體化非建構函式。"

若用 google 去查的話,可以找到一堆與 Document Class 相關的議題,不過這次我遇到的可不是那樣的問題。事實上,我遇到的問題正如他的錯誤訊息一樣的清楚,只不過難以發覺。

以下,我先準備一個我簡化過的問題案例:

Test.fla 的 Document Class 為 Test.as


package{
import flash.display.MovieClip;

import a.Vector;

public class Test extends MovieClip{

var v:Vector = new Vector();

public function Test(){

trace(123, v);

}

}

}


在這個 Test.as 中,有用到一個 package a 下的 Vector 類別:


package a{
public class Vector{
public function Vector(){
trace("Vector!!");
}
}
}


這個案例,若是發佈成 Flash Player 9 的話,一點問題也沒有,但若是發佈成 Flash Player 10 的話,就會出現錯誤訊息:

TypeError: Error #1007: 嘗試個體化非建構函式。
at Test()

我查了許久後,才發現問題出在那個 a.Vector,因為在 Flash Player 10 還沒推出時,Flash Player 還沒有內建 Vector 類別,所以當我們寫 var v:Vector = new Vector(); 時,可以由 import a.Vector (或 import a.*) 中找到這個 Vector 類別。可是到了 Flash Player 10 之後,會先找到的是全域類別物件 Vector,就像 String、Number 一樣,而不是我們自訂的 a.Vector 類別。

然而因為 Flash Player 10 新具備的 Vector 類別並不具有 "不帶參數的建構式",所以就會出現 "嘗試個體化非建構函式" 的錯誤訊息啦!

如果你們家的 Flash 程式,你或前人也有從不知道哪裡找來的 Vector 類別的話,或是任何改寫自其他程式語言 (Java) 的常用類別的話,未來都很有可能遇到這種同名的衝突問題。

解決方法一,將 Test.as 改寫成:


package{
import flash.display.MovieClip;

import a.Vector;

public class Test extends MovieClip{

var v:a.Vector = new a.Vector();

public function Test(){

trace(123, v);

}

}

}


使用自訂的 Vector 類別時,請明確指出完整路徑 var v:a.Vector = new a.Vector(); 即可。

解決方法二,將自訂的 Vector 類別重構一下,改名ㄅㄟ,反正現在的開發工具都很方便,重構時會協助你將所有已經使用到的程式碼都一起更新,除非你是使用 "字串轉類別" 的作法。

2009年6月18日星期四

將文字隱藏在圖片中

這兩天在研究如何將文字資訊隱藏在圖片中的技術,在 google 查了一些 "secure image sharing" 的資料,但是都沒有看到實作的方法(其實是沒有看到範例程式碼),最後,我參考 Wiki 上關於 Steganography 的介紹:

http://en.wikipedia.org/wiki/Steganography

寫了以下的類別:

Steganography.as


package idv.ben.steganography
{
import flash.display.BitmapData;
import flash.geom.Point;

public class Steganography
{
static private var __instance:Steganography;
static public function getInstance():Steganography{
if(__instance==null)
__instance = new Steganography();
return __instance;
}

private var __totalWidth:int;
private var __totalHeight:int;
private var __point:Point;

public function Steganography()
{
if(__instance!=null)
throw new Error("plz use Steganography.getInstance()");
}

public function encode(oBD:BitmapData, txt:String):BitmapData{
var txtLen:int = txt.length;
var txtLenLen:int = String(txtLen).length;

if(oBD.width * oBD.height < txtLen + 10)
return null;

var newBD:BitmapData = oBD.clone();
__totalWidth = newBD.width;
__totalHeight = newBD.height;
__point = null;

var c:String;
var p:Point;
var newPixel:uint;

//txtLenLen
c = String(txtLenLen);
p = getNextPoint();
newPixel = putCharIntoPixel(c, oBD.getPixel(p.x, p.y));
newBD.setPixel(p.x, p.y, newPixel);

//txtLen
for(var i:int=0; i<txtLenLen; i++){
c = String(txtLen).substr(i, 1);
p = getNextPoint();
newPixel = putCharIntoPixel(c, oBD.getPixel(p.x, p.y));
newBD.setPixel(p.x, p.y, newPixel);
}

//txt
for(var j:int=0; j<txtLen; j++){
c = txt.substr(j, 1);
p = getNextPoint();
newPixel = putCharIntoPixel(c, oBD.getPixel(p.x, p.y));
newBD.setPixel(p.x, p.y, newPixel);
}

return newBD;
}

public function decode(bd:BitmapData):String{
__totalWidth = bd.width;
__totalHeight = bd.height;
__point = null;

var txtLenLen:int;
var txtLen:int
var txt:String = "";

var p:Point;
var c:String;

//txtLenLen
if(bd.width * bd.height <= 0)return "";
p = getNextPoint();
c = getCharFromPixel(bd.getPixel(p.x, p.y));
txtLenLen = int(c);

//txtLen
if(bd.width * bd.height <= (1 + txtLenLen))return "";
var strTxtLen:String = "";
for(var i:int=0; i<txtLenLen; i++){
p = getNextPoint();
c = getCharFromPixel(bd.getPixel(p.x, p.y));
strTxtLen += c;
}
txtLen = int(strTxtLen);

//txt
if(bd.width * bd.height <= (1 + txtLenLen + txtLen))return "";
for(var j:int=0; j<txtLen; j++){
p = getNextPoint();
c = getCharFromPixel(bd.getPixel(p.x, p.y));
txt += c;
}

return txt;
}

private function getNextPoint():Point{
if(__point==null){
__point = new Point(0, 0);
}else{
if(__point.x < __totalWidth-1){
__point.x++;
}else{
__point.x = 0;
__point.y++;
}
}
return __point;
}

private function putCharIntoPixel(char:String, oPixel:uint):uint{
var r:uint = (oPixel >> 16) & 255;
var g:uint = (oPixel >> 8) & 255;
var b:uint = (oPixel >> 0) & 255;

var charCode:String = String(char.charCodeAt(0));
while(charCode.length<3)
charCode = "0" + charCode;

var dr:uint = uint(charCode.substr(0, 1));
var dg:uint = uint(charCode.substr(1, 1));
var db:uint = uint(charCode.substr(2, 1));

var r2:uint = ((r >> 4) << 4) | dr;
var g2:uint = ((g >> 4) << 4) | dg;
var b2:uint = ((b >> 4) << 4) | db;

return r2 << 16 | g2 << 8 | b2;
}

private function getCharFromPixel(pixel:uint):String{
var dr:uint = (pixel >> 16) & 15;
var dg:uint = (pixel >> 8) & 15;
var db:uint = (pixel >> 0) & 15;

var charCode:String = String(dr) + String(dg) + String(db);
var char:String = String.fromCharCode(int(charCode));
return char;
}
}
}


使用範例如下,載入一張圖,並將 "Hello World!!" 的字串給隱藏進去,產生出第二張看似一樣的圖,最後再由第二張圖的 BitmapData 取出該字串。

SteganographyAS3 .as


package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;

import idv.ben.steganography.Steganography;

public class SteganographyAS3 extends Sprite
{
[Embed(source='../asset/IMG_3641.jpg', mimeType='image/jpeg')]
public var Img:Class;

public function SteganographyAS3()
{
var bmp:Bitmap = new Img() as Bitmap;
bmp.scaleX = bmp.scaleY = 0.5;
this.addChild(bmp);

var msg:String = "hello world!!";
var newBD:BitmapData = Steganography.getInstance().encode(bmp.bitmapData, msg);
var newBMP:Bitmap = new Bitmap(newBD);
newBMP.x = bmp.x + bmp.width;
newBMP.scaleX = newBMP.scaleY = 0.5;
this.addChild(newBMP);

var msg2:String = Steganography.getInstance().decode(newBMP.bitmapData);
trace("decode=>", msg2);
}
}
}


執行結果,出現兩張圖,看起來沒甚麼不同,可能要將欲編入的文字資料放多一點,或許可以看到一些像素的不同吧:



將第二張圖(右邊)的 BitmapData 中隱藏的資料解出來後,trace 在 Flex Builder 的輸出視窗中:



==============================================================

[2009-06-19-13-00]

作了一個範例,完整程式碼:


package
{
import com.adobe.images.PNGEncoder;

import fl.containers.ScrollPane;
import fl.controls.Button;
import fl.controls.TextArea;

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.FileFilter;
import flash.net.FileReference;
import flash.utils.ByteArray;
import flash.utils.setTimeout;

import idv.ben.steganography.Steganography;

public class Demo2 extends MovieClip
{
public var btnBrowse:Button;
public var btnEncode:Button;
public var btnSave:Button;
public var btnLoad:Button;
public var btnDecode:Button;

public var spImg:ScrollPane;
public var spImg2:ScrollPane;

public var txtInput:TextArea;
public var txtOutput:TextArea;

private var __fileReference:FileReference = new FileReference();
private var __fileReference2:FileReference = new FileReference();

public function Demo2()
{
btnBrowse.addEventListener(MouseEvent.CLICK, onBtnBrowseClick);
btnEncode.addEventListener(MouseEvent.CLICK, onBtnEncodeClick);
btnSave.addEventListener(MouseEvent.CLICK, onBtnSaveClick);
btnLoad.addEventListener(MouseEvent.CLICK, onBtnLoadClick);
btnDecode.addEventListener(MouseEvent.CLICK, onBtnDecodeClick);

__fileReference.addEventListener(Event.SELECT, onFileReferenceSelect);
__fileReference.addEventListener(Event.COMPLETE, onFileReferenceComplete);

__fileReference2.addEventListener(Event.SELECT, onFileReference2Select);
__fileReference2.addEventListener(Event.COMPLETE, onFileReference2Complete);
}

private function onBtnBrowseClick(e:MouseEvent):void{
trace("onBtnBrowseClick()");

var typeFilter:Array = [new FileFilter("Images(*.jpg;*.gif;*.png)", "*.jpg;*.gif;*.png")];
__fileReference.browse(typeFilter);
}

private function onBtnEncodeClick(e:MouseEvent):void{
trace("onBtnEncodeClick()");

var bd:BitmapData = getEncodedBitmapData(spImg);
if(bd == null)
return;

var txt:String = txtInput.text;

if(txt == "")
return;

var newBD:BitmapData = Steganography.getInstance().encode(bd, txt);
var newBMP:Bitmap = new Bitmap(newBD);
spImg2.source = newBMP;
setTimeout(spImg2.update, 200);
}

private function onBtnSaveClick(e:MouseEvent):void{
trace("onBtnSaveClick()");

var bd:BitmapData = getEncodedBitmapData(spImg2);
if(bd == null)
return;

var data:ByteArray = PNGEncoder.encode(bd);
var fr:FileReference = new FileReference();
fr.save(data, "EncodeImage.png");
}

private function onBtnLoadClick(e:MouseEvent):void{
trace("onBtnLoadClick()");

var typeFilter:Array = [new FileFilter("Images(*.jpg;*.gif;*.png)", "*.jpg;*.gif;*.png")];
__fileReference2.browse(typeFilter);
}

private function onBtnDecodeClick(e:MouseEvent):void{
trace("onBtnDecodeClick()");

var bd:BitmapData = getEncodedBitmapData(spImg2);
if(bd == null)
return;

var txt:String = Steganography.getInstance().decode(bd);
txtOutput.text = txt;
}

private function onFileReferenceSelect(e:Event):void{
trace("onFileReferenceSelect()");

__fileReference.load();
}

private function onFileReferenceComplete(e:Event):void{
trace("onFileReferenceComplete()");

var data:ByteArray = __fileReference.data;
var loader:Loader = new Loader();
loader.loadBytes(data);
spImg.source = loader;
setTimeout(spImg.update, 200);
}

private function onFileReference2Select(e:Event):void{
trace("onFileReference2Select()");

__fileReference2.load();
}

private function onFileReference2Complete(e:Event):void{
trace("onFileReference2Complete()");

var data:ByteArray = __fileReference2.data;
var loader:Loader = new Loader();
loader.loadBytes(data);
spImg2.source = loader;
setTimeout(spImg2.update, 200);
}

private function getEncodedBitmapData(sp:ScrollPane):BitmapData{
if(sp.content == null)
return null;

var bmp:Bitmap;

if(sp.content is Loader){
if(Loader(sp.content).content == null)
return null;

bmp = Bitmap(Loader(sp.content).content);
}else if(sp.content is Bitmap){
bmp = Bitmap(sp.content);
}else{
return null;
}

return bmp.bitmapData;
}
}
}


操作步驟:

加密:
1. 按下 Browse 按鈕,載入原始圖片到左上角的 ScrollPane 中。
2. 在右上角的文字框中輸入欲藏入的文字 (此版 不接受雙位元文字)。
3. 按下 Encode 按鈕,會將處理好後的圖片放到左下角的 ScrollPane 中。
4. 可按下 Save 按鈕將圖片存檔。

解密:
5. 按下 Load 按鈕,將內含資訊的圖片載入到左下角的 ScrollPane 中。
6. 按下 Decode 按鈕,將文字資訊從圖片中解出來到右下角的文字框中。

程式試用:







或到以下網址試用:

http://ben.rb.chang.googlepages.com/20090619_SteganographyAS3.html

關於我






* ben {dot} chang {at} ben {dot} idv {dot} tw
* FriendFeed

贊助我1元美金:

Plurk

標籤雲