blog.Ring.idv.tw

ActionScript

Sobel - 邊緣偵測 for AS2

這是常見影像處理中的Sobel邊緣偵測法~ 有興趣的人不妨玩玩哦~

相關的演算法細節~ 請參閱Google大神中的Sobel影像處理一節~

Sobel

import flash.display.BitmapData;
function Sobel():Void
{
	var myBitmapData:BitmapData = BitmapData.loadBitmap("bear");
	var height:Number = myBitmapData.height;
	var width:Number = myBitmapData.width;

	var gray:Array = new Array(width);

	for(var i:Number = 0 ; i < width ; i++)
		gray[i] = new Array(height);
		
	var gray2:Array = new Array(width);

	for(var i:Number = 0 ; i < width ; i++)
		gray2[i] = new Array(height);

	var sobscale = 1.0;
	var offsetval = 0;
	// RGB to GRAY
	for(var i:Number = 0 ; i < width ; i++)
	{
		for(var j:Number = 0 ; j < height ; j++)
		{
			var rgb:Number = myBitmapData.getPixel(i,j);
			var r:Number = 0xFF&(rgb >> 16);
			var g:Number = 0xFF&(rgb >> 8);
			var b:Number = 0xFF&rgb;			
			gray[i][j]= 0.299*r + 0.587*g +0.114*b;
		}
	}
	
	for(var x = 1; x < width-1;x++)
	{
		for(var y = 1; y < height-1;y++)
		{
			/**
			 00(a) 10(b) 20(c)
			 01(d) 11(*) 21(e)
			 02(f) 12(g) 22(h)
			*/
			var a = gray[x-1][y-1];
			var b = gray[x][y-1];
			var c = gray[x+1][y-1];
			var d = gray[x-1][y];
			var e = gray[x+1][y];
			var f = gray[x-1][y+1];
			var g = gray[x][y+1];
			var h = gray[x+1][y+1];
			
			var hor = (a+d+f) - (c+e+h);
			
			if(hor < 0)
			hor = -hor;
			
			var vert = (a+b+c) - (f+g+h);
			
			if(vert < 0)
			vert = -vert;
			
			var gc = (sobscale * (hor + vert));
			gc = (gc + offsetval);
			
			if (gc > 255)
			gc = 255;
			
			gray2[x][y] = 0xff000000  |gc<<16 | gc<<8 | gc;
		}
	}
	
	//set pixel value
	for(var i:Number = 0 ; i < width ; i++)
	{
		for(var j:Number = 0 ; j < height ; j++)
		{
				
			myBitmapData.setPixel(i,j,gray2[i][j]);
		}
	}

	var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
	mc.attachBitmap(myBitmapData,this.getNextHighestDepth());
}
Sobel();

2007-05-06 23:35:59 | Comments (5)

Mosaic - 影像處理 for AS2

這是之前修課時寫的一個「馬賽克」影像程式~ 不過那時AS3尚未問世~ 我想用AS3重新寫過的話~ 處理速度應該會增進不少~ 留待以後再做試驗~

Mosaic

import flash.display.BitmapData;
function setImage(para:Number):Void
{
	var myBitmapData:BitmapData = BitmapData.loadBitmap("lena");

	var height:Number = myBitmapData.height;
	var width:Number = myBitmapData.width;
	
	//declare a two-dimensional array
	var rgb:Array = new Array(width);
	for(var j:Number = 0 ; j < height ; j++)
		rgb[j] = new Array(height);
	
	//get pixel value to rgb array
	for(var i:Number = 0 ; i < width ; i++)
	{
		for(var j:Number = 0 ; j < height ; j++)
		{
		    rgb[i][j] = myBitmapData.getPixel(i,j);
		}
	}

	var checkedsize = (para < 1) ? 1 : para;
	
	//get index pixel value to temp array
	var temp:Array = new Array();
	for(var i:Number = 0 ; i < width ; i+=checkedsize)
	{
		for(var j:Number = 0 ; j < height ; j++)
		{
			if(i % checkedsize == 0 && j % checkedsize == 0)
			{
			    temp[temp.length] = rgb[i][j];
			}
		}
	}
	
	//set index pixel value to rgb array
	var tmp:Number = 0;
	for(var i:Number = 0 ; i < width ; i+=checkedsize)
	{
		for(var j:Number = 0 ; j < height ; j++)
		{
			if(i % checkedsize == 0 && j % checkedsize == 0)
			{
				for(var m:Number = 0 ; m < checkedsize ; m++)
				{
					for(var n:Number = 0 ; n < checkedsize ; n++)
					{
						rgb[i+m][j+n]=temp[tmp];
					}
				}
				tmp++;
			}
		}
	}

	//set pixel value
	for(var i:Number = 0 ; i < width ; i++)
	{
		for(var j:Number = 0 ; j < height ; j++)
		{
				myBitmapData.setPixel(i,j,rgb[i][j]);
		}
	}
	var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
	mc.attachBitmap(myBitmapData,this.getNextHighestDepth());
}
setImage(20);

2007-05-06 23:21:39 | Add Comment

ActionScript 2 [this] vs. ActionScript 3 [this]

我們將測試一下,看看AS2的this和AS3的this有什麼不同之處!

ActionScript 2

trace(this);
trace(this instanceof MovieClip);

輸出的結果為:

_level0
true

_level0 是Flash Runtime Level的最底層,只要任何的swf被載入這一層,便會改變成以欲載入swf的FrameRate。

ActionScript 3

trace(this);
trace(this is MovieClip);

輸出的結果為:

[object MainTimeline]
true

在AS3,它已經變成MainTimeline,但是它終究還是個MovieClip~為什麼呢?

我們看看下面這個指令~

trace(describeType(MainTimeline));

印出一大堆...

<type name="MyTest_fla::MainTimeline" base="Class" isDynamic="true" isFinal="true" isStatic="true">
  <extendsClass type="Class"/>
  <extendsClass type="Object"/>
  <accessor name="prototype" access="readonly" type="*" declaredBy="Class"/>
  <factory type="MyTest_fla::MainTimeline">
    <extendsClass type="flash.display::MovieClip"/>
    <extendsClass type="flash.display::Sprite"/>
    <extendsClass type="flash.display::DisplayObjectContainer"/>
    <extendsClass type="flash.display::InteractiveObject"/>
    <extendsClass type="flash.display::DisplayObject"/>
    <extendsClass type="flash.events::EventDispatcher"/>
    <extendsClass type="Object"/>
    ....省略

也就是說MainTimeline是繼承MovieClip~

2007-04-30 12:53:14 | Add Comment

Next Posts
Copyright (C) Ching-Shen Chen. All rights reserved.

::: 搜尋 :::

::: 分類 :::

::: 最新文章 :::

::: 最新回應 :::

::: 訂閱 :::

Atom feed
Atom Comment