จากตัวอย่างข้างบน จะเป็นการปรับค่าสี BitmapData ที่ได้มาจาก webCam

สำหรับการปรับปรุงเปลี่ยนค่าสีของแต่ละ pixel ใน BitmapData เราสามารถทำได้โดย ใช้ Threshold

โดยวิธีการใช้งานมีดังนี้

1
2
3
4
...
// bmd:BitmapData <-- bmd คือ BitmapData
bmd.threshold(bmd, bmd.rect, new Point(), ">", 0xFFCCCCCC, 0xFFFF0000); // ถ้า pixel นี้มีค่า > 0xFFCCCCCC (ARGB) ให้แทนค่าด้วย 0xFFFF0000 (ARGB)
...

ซึ่งจะเหมือนกับเราทำแบบนี้

1
2
3
4
5
6
7
8
9
// ซึ่งจะเหมือนกับการใช้วิธีนี้เปลี่ยนค่าสี
for (var i:int = 0; i < bmd.width; i++) {
	for (var j:int = 0 ; j < bmd.height; j++) {
		var pixelColor:uint = bmd.getPixel(i, j);
		if (pixelColor > 0xFFCCCCCC) {
			bmd.setPixel(i, j, 0xFFFF0000);
		}
	}
}

ดู source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package 
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.ActivityEvent;
	import flash.events.Event;
	import flash.geom.Point;
	import flash.media.Camera;
	import flash.media.Video;
	import org.flashdevelop.utils.FlashConnect;
 
	public class Main extends Sprite 
	{
		private var video:Video;
		private var webcam:Camera;
		private var bmpOutput:Bitmap;
		private var bmpData:BitmapData;
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
 
			stageConfig();
			initWebCam();
 
			this.addEventListener(Event.ENTER_FRAME, onEnterframe);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
		}
 
		private function stageConfig():void {
			stage.align = StageAlign.TOP_LEFT;
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.frameRate = 60;
		}
 
		private function initWebCam():void {
			webcam = Camera.getCamera();
			if (webcam != null) {
				webcam.addEventListener(ActivityEvent.ACTIVITY, activityHandler);
				webcam.setMode(320, 240, 10, false);
				webcam.setQuality(0, 100);
 
				video = new Video(webcam.width, webcam.height);
				video.attachCamera(webcam);
				video.width = 320;
				video.height = 240;
				this.addChild(video);
 
			}else {
				FlashConnect.trace("cannot detect webcam");  //show output in flashDevelop
			}
		}
 
		private function activityHandler(e:ActivityEvent):void {
			//FlashConnect.trace("activate ok");
			bmpData = new BitmapData(video.width, video.height);
			bmpData.draw(video);
 
			if (bmpOutput == null) {
				bmpOutput = new Bitmap(bmpData);
				bmpOutput.x = 350;
				bmpOutput.y = 0;
				this.addChild(bmpOutput);
			}else {
				bmpOutput.bitmapData = bmpData;
			}			
		}
 
		private function onEnterframe(e:Event):void {
			bmpData.draw(video);
			filterBitmapData(bmpData);
			bmpOutput.bitmapData = bmpData;
		}
 
		private function filterBitmapData(bmd:BitmapData):void {
			//bmd.threshold(bmd, bmd.rect, new Point(), ">", 0xFFCCCCCC, 0xFFFF0000);
			/*
			for (var i:int = 0; i < bmd.width; i++) {
				for (var j:int = 0 ; j < bmd.height; j++) {
					var pixelColor:uint = bmd.getPixel(i, j);
					if (pixelColor > 0xFFCCCCCC) {
						bmd.setPixel(i, j, 0xFFFF0000);
					}
				}
			}
			*/
 
			bmd.threshold(bmd, bmd.rect, new Point(), ">", 0xFF808080, 0xFFffffff);
			bmd.threshold(bmd, bmd.rect, new Point(), "<=", 0xFF808080, 0xFF000000);
 
		}
	}
 
}

เอกสารอ้างอิง
http://www.howdoflash.net/2010/06/17/as3_color_detection/
http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/flash/display/BitmapData.html#threshold%28%29