Actionscript3でgray scale

February 29, 2008

まずサンプルを見てください。

yosemite-stream.jpg

これが、元画像です。

で、下のが2種類の方法でグレースケール化しています。
FLASHになっていますので、画面をクリックで切り替えてみてみてください。

demo of flash

まずは、example1のコードはこちらです。
ColorMatrixFilterのMatrixの値をRGB3等分にして平均化しています。

package {
	import flash.display.Sprite;
	import flash.filters.ColorMatrixFilter;

	public class Gray extends Sprite {
		private const OFFSET_R:Number = 1 / 3;
		private const OFFSET_G:Number = 1 / 3;
		private const OFFSET_B:Number = 1 / 3;

		public function Gray():void {
			var matrix:Array = [OFFSET_R, OFFSET_G, OFFSET_B, 0, 0,
								OFFSET_R, OFFSET_G, OFFSET_B, 0, 0,
								OFFSET_R, OFFSET_G, OFFSET_B, 0, 0,
								0, 0, 0, 1, 0];
			var cmf:ColorMatrixFilter = new ColorMatrixFilter(matrix);
			this.filters = [cmf];
		}
	}
}

これでも、別に構わないのですが、もう少し厳密に考えると違います。

なぜかというと、R,G,Bそれぞれの、本来の明度を無視しているからです。

簡単な図解のページ

こちらを見ると分かるのですが、当然0×00FF00の方が0×0000FFよりも明度が高いです。

そこで、輝度を計算する式があります。

Y(輝度) = 0.299 * R + 0.587 * G + 0.114 * B

これを見ると青の要素なんて殆ど反映されないのが分かります。

しかしexample1の方は、

Y =(R + G + B) / 3

で計算していますので、輝度の計算式と比較すると青の明度を拾いすぎ。ということになります。

example2のほうは輝度の計算式に沿ってグレイスケール化しています。
FLASHをもう一度見ていただくと、example2の方が、元画像の青の部分が暗いのが分かります。

というわけでこの部分を反映させたexample2のコードはこちら

	import flash.display.Sprite;
	import flash.filters.ColorMatrixFilter;

	public class Gray extends Sprite {
		private const OFFSET_R:Number = 0.299;
		private const OFFSET_G:Number = 0.587;
		private const OFFSET_B:Number = 0.114;

		public function Gray():void {
			var matrix:Array = [OFFSET_R, OFFSET_G, OFFSET_B, 0, 0,
								OFFSET_R, OFFSET_G, OFFSET_B, 0, 0,
								OFFSET_R, OFFSET_G, OFFSET_B, 0, 0,
								0, 0, 0, 1, 0];
			var cmf:ColorMatrixFilter = new ColorMatrixFilter(matrix);
			this.filters = [cmf];
		}
	}
}

BitmapDataを関数内で扱う時の注意

February 26, 2008

関数内でローカルなBitmapDataを一時的にローカルなBitmapに入れたりすると、メモリに残っていってしまうのか、途中から正常に動かなくなってしまうようです。
複数のBitmapDataを使ってごにょごにょして、最終的にあるBitmapDataを作りたい時とかに、途中で一回まとめるためにローカルなBitmapを使おうとしたのですが、”途中から正常に動かない”という現象に陥ったので調べてみました。

超シンプルにしたダメなコードはこんな感じ。

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

	public class DrawTest extends Sprite {
		private var cnt:int;
		public function DrawTest():void {
			cnt = 0;
			addEventListener(Event.ENTER_FRAME, drawBmd);
		}

		private function drawBmd(e:Event):void {
			trace(++cnt);
			var bmd:BitmapData;
			var bmp:Bitmap;

			for (var i:int = 0; i < 20; i++) {
				bmd = new BitmapData(400, 400);
				bmp = new Bitmap(bmd);
			}
		}
	}
}

上のコードで実行すると僕のPCでは81ループ目に必ず、

81
ArgumentError: Error #2015: BitmapData が無効です。
at flash.display::BitmapData$iinit()
at DrawTest/::drawBmd()

とエラーが。
ローカル変数でもダメナノネー!!

というわけで、解決するには用がなくなった後にdispose()すればいい感じ。
エラーは一応出なくなりました。

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

	public class DrawTest extends Sprite {
		private var cnt:int;
		public function DrawTest():void {
			cnt = 0;
			addEventListener(Event.ENTER_FRAME, drawBmd);
		}

		private function drawBmd(e:Event):void {
			trace(++cnt);
			var bmdArray:Array = [];
			var bmd:BitmapData;
			var bmp:Bitmap;

			for (var i:int = 0; i < 20; i++) {
				bmd = new BitmapData(400, 400);
				bmdArray.push(bmd);
				bmp = new Bitmap(bmd);
			}

			for each(bmd in bmdArray) bmd.dispose();
		}
	}
}

気をつけませう。

イラストになってました。

February 23, 2008

一昨日、Noughts::の山本君と、Pied Piperのりゅうらさんと、ペパボの永岡さんとご飯食べたのですが、その日の感じをりゅうらさんがイラストにしてくれていました
なんかイラストで描かれたの初めてなのですが、すごいイケ絵だったので思わず書いてしました。
ありがとうございます!Mixiのトップ画像にさせていただきます!w

Blogのデザインを変えた件。

February 20, 2008

今回も思い付きでガガッと変えました。
最近自分的にミニマム&グリッドシステムを勉強中なので、
もろに読んだ本の影響を受けてしまっている感は否めません。
いいんです、最初は基礎。
基礎をしっかりやらなきゃハズシが使えません、それは美容師の経験で重々承知しています。

それはさておき、最近ミニマムを勉強&意識しているのですが、不思議と生活までミニマム?になってくるもんですね。

例えば買う服にしろ余計な柄などが気になってしまいます。
あと、早寝早起きになりました。←関係あるのか?w

なんだかしらないけど、すがすがしい気分になります。
多分、自分を一度0地点に戻しているようで、色々なものがとても魅力的に見れるようになってきた気がします。
これってミニマムな視点っぽいかも。
なんせ、気分がいいです。この感覚は大切にしたいかも。

もろに影響を受けてしまった最近買った本はこちら

415p1sk791l_aa240_.jpg
Grid Systems in Graphic Design/Raster Systeme Fur Die Visuele Gestaltung (ハードカバー)

てか、こんなに基本的な本を今まで読んでなかったことが問題!

ワクワクさせられるキャンペーンサイト

February 14, 2008

LUPIN STEAL-ダイヤを盗みだせ!-

これ、昨日の朝方4時位でしょうか。ユーキ君からメッセンジャーで聞いて知ったのですが、面白いです。

簡単に説明すると100万円のダイヤがある部屋に置いてあって、そこにライブカメラが仕掛けてあるんですが、

まず、FMS?に侵入して(同時4人までなので、完全確率ですが、侵入すること自体ちょっと大変。)6桁のコードを入力して、成功したらそのダイヤが貰えるといういたってシンプルな内容。

ただ、内容的に普通に考えたら怪しいし、本当に貰えるの?とか思ったり、なんか胡散臭く成りかねないのだけど、そこでルパン三世とタイアップすることで、納得が生まれ、気持ち悪さもなく、安心感もあるし、ルパンとコンテンツが引き立ってると思います。 (当然ルパンありきなのでしょうが。)

絶対ダイヤモンド取ろう!と二人で盛り上がり、画面内にある電話番号に電話すると画面内にある携帯が鳴って、ルパンと5桁の数字が出るので、それがヒントだと思い、「宝は山分けだw」とか言いながら色々試したのですが、取れませんでした。

よくよく考えてみたら5桁の数字は自分の携帯の下5桁で、前半がテープか何かで隠されているだけということに気づき、軽く鬱になりました。

そりゃ、決まったルールがあれば、一人突破した人がいるので、その人が友達にこっそり教えればあっという間にダイヤモンド5個とも持ってかれてしまいますもんね。

ワクワクさせてくれたこの素敵なコンテンツを作ったのは、セミトラさん

This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.
(c) 2010 Muraken.biz | powered by WordPress with Barecity