2011年11月21日 星期一

[AS3] BitmapData.colorTransform()方法_改變點陣影像指定區域顏色值


BitmapData.colorTransform(rect:Rectangle, colorTransform:flash.geom:ColorTransform):void
使用 ColorTransform 物件調整點陣圖影像指定區域中的顏色值。 如果矩形符合點陣圖影像的邊界,則此方法將會變化整個影像的顏色值。
參數
rect:Rectangle — 定義 ColorTransform 物件套用之影像區域的 Rectangle 物件。
colorTransform:flash.geom:ColorTransform — 用來說明要套用之顏色轉換值的 ColorTransform 物件。





1001120_ColorTransform_1.swf

※ 點擊start鈕開始變色, 其間,點擊stage暫停, 再次點擊stage繼續執行

ColorTransform()建構函式
ColorTransform(redMultiplier:Number = 1.0, greenMultiplier:Number = 1.0, blueMultiplier:Number = 1.0, alphaMultiplier:Number = 1.0, redOffset:Number = 0, greenOffset:Number = 0, blueOffset:Number = 0, alphaOffset:Number = 0)
以指定的顏色色版值和 Alpha 值為顯示物件建立 ColorTransform 物件。
參數
redMultiplier:Number (default = 1.0) — 紅色倍數的值 (範圍從 0 至 1)。
greenMultiplier:Number (default = 1.0) — 綠色倍數的值 (範圍從 0 至 1)。
blueMultiplier:Number (default = 1.0) — 藍色倍數的值 (範圍從 0 至 1)。
alphaMultiplier:Number (default = 1.0) — Alpha 透明度倍數的值 (範圍從 0 至 1)。
redOffset:Number (default = 0) — 紅色顏色色版的偏移值 (範圍從 -255 至 255)。
greenOffset:Number (default = 0) — 綠色顏色色版的偏移值 (範圍從 -255 至 255)。
blueOffset:Number (default = 0) — 藍色顏色色版的偏移值 (範圍從 -255 至 255)。
alphaOffset:Number (default = 0) — Alpha 透明度色版值的偏移 (範圍從 -255 至 255)。

  • 新的紅色值 = (舊的紅色值 * redMultiplier ) + redOffset
  • 新的綠色值 = (舊的綠色值 * greenMultiplier ) + greenOffset
  • 新的藍色值 = (舊的藍色值 * blueMultiplier ) + blueOffset
  • 新的 Alpha 值 = (舊的 Alpha 值 * alphaMultiplier ) + alphaOffset

※ ColorTransform物件的兩種使用方法
  1. 在 BitmapData 類別之 colorTransform() 方法的 colorTransform 參數中使用

    colorTransform(rect:Rectangle, colorTransform:flash.geom:ColorTransform):void

    使用 ColorTransform 物件調整點陣圖影像指定區域中的顏色值。
  2. 當作 Transform 物件 (可當作顯示物件的 transform 屬性使用) 的 colorTransform 屬性使用

此例:
(一)
調用ColorTransform類別建構式,定義新建的colorTransform物件為
new ColorTransform(0.99,0.99,0.99,1)
--> (R,G,B,Alpha)依序為(0.99,0.99,0.99,1)
(二)
而後在 ENTER_FRAME 下, 持續調用
BitmapData.colorTransform(rect:Rectangle, colorTransform:flash.geom:ColorTransform) 方法
將(一)的colorTransform物件做為此處的colorTransform參數
每次執行都將r,g,b三色版各乘以0.99, 改變其顏色, 當r,g,b三色版都為0, Bitmap就變成黑色.

import flash.geom.ColorTransform;
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.events.Event;
import flash.sensors.Accelerometer;
import flash.geom.Rectangle;
import flash.text.TextField;
import flash.events.MouseEvent;
import flash.display.MovieClip;

var infoTF:TextField;
var startBtn:MovieClip;
var flag:Boolean = false;
var ctf:ColorTransform = new ColorTransform(0.99,0.99,0.99,1);
var bmd:BitmapData = new BitmapData(500,350,false,0xff00ff);
var bmdBluePrint:BitmapData = bmd.clone();
var bm:Bitmap = new Bitmap(bmd);
var rec:Rectangle = new Rectangle(0,0,bmd.width,bmd.height);
addChild(bm);
addChild(infoTF);
addChild(startBtn);

startBtn.buttonMode = true;
startBtn.addEventListener(MouseEvent.CLICK,startHandler);

function startHandler(event:MouseEvent):void{
 /**/
 bmd = bmdBluePrint.clone();
 bm.bitmapData = bmd;
 
 flag = false;
 addEventListener(Event.ENTER_FRAME,loopHandler);
 stage.addEventListener(MouseEvent.CLICK,clickHandler);
 return;
}

function loopHandler(event:Event):void {
 bmd.colorTransform(rec,ctf);
 var tmpString:String = "0x" + (bmd.getPixel(250,175)).toString(16);
 infoTF.text = tmpString;
 trace(tmpString);
 if(tmpString == "0x0"){
  removeEventListener(Event.ENTER_FRAME,loopHandler);
  stage.removeEventListener(MouseEvent.CLICK,clickHandler);
  flag == false;
  return;
 }
 return;
}

function clickHandler(event:MouseEvent):void {
 if (flag == true) {
  removeEventListener(Event.ENTER_FRAME,loopHandler);
  flag = false;
 } else{
  addEventListener(Event.ENTER_FRAME,loopHandler);
  flag = true;
 }
 return;
}

沒有留言: