<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>橋本商会 &#187; Flash</title>
	<atom:link href="http://shokai.org/blog/archives/tag/flash/feed" rel="self" type="application/rss+xml" />
	<link>http://shokai.org/blog</link>
	<description>なんか作ったりした記録を忘れないうちに書くblog</description>
	<lastBuildDate>Mon, 06 Feb 2012 13:32:44 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com/" />
			<item>
		<title>chumby用ふぁぼったーwidget</title>
		<link>http://shokai.org/blog/archives/1539</link>
		<comments>http://shokai.org/blog/archives/1539#comments</comments>
		<pubDate>Sun, 18 May 2008 23:39:09 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[AS2]]></category>
		<category><![CDATA[chumby]]></category>
		<category><![CDATA[favotter]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=1539</guid>
		<description><![CDATA[ふぁぼったーのwidgetを作った。 ダウンロード → Favotter Widget (Flash AS2 / CS3) ■設定方法 今回もUSBメモリから起動するんだけど、特に設定項目も無いのでzipの中身をそのまま [...]]]></description>
			<content:encoded><![CDATA[<p>
<p><a href="http://favotter.matope.com/">ふぁぼったー</a>のwidgetを作った。</p>
<p>ダウンロード → <a href="http://shokai.org/archive/chumby/080519_Favotter/">Favotter Widget (Flash AS2 / CS3)</a></p>
<p><a href="http://www.flickr.com/photos/shokai/2479528971/" title="favotter on chumby by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3256/2479528971_29ee326ae4_m.jpg" width="240" height="210" alt="favotter on chumby" /></a><a href="http://www.flickr.com/photos/shokai/2483808754/" title="DSCF2209 by shokai, on Flickr"><img src="http://farm3.static.flickr.com/2190/2483808754_eeee064c65_m.jpg" width="240" height="180" alt="DSCF2209" /></a></p>
<p>■設定方法<br /><br />
今回も<a href="http://shokai.org/blog/archives/1534">USBメモリから起動</a>するんだけど、特に設定項目も無いのでzipの中身をそのままUSBメモリに入れてchumbyに刺して、しばらくしてからchannel -> reloadで良い。</p>
<p>人気favと注目favをそれぞれ表示するために、swfが2つ入っている。<br /><br />
前のTwitter widgetと共存させるには、同梱のprofile.xmlを見れば2つのwidgetを読み込ませる設定の参考になると思う。widget_instanceのidが重複しないように注意。</p>
<p>■ダイナミックテキストにHTML表示とか<br /><br />
実装は、前の<a href="http://shokai.org/blog/archives/1538">Twitter widget</a>の時とほぼ同じというか見た目を白黒にしただけなんだけど<br /><br />
ふぁぼったーのFeedにCDATAでHTMLが埋め込んであるので、せっかくなのでそれを利用する事にした所だけが違う。</p>
<p>FlashのダイナミックテキストのhtmlTextプロパティにHTMLを突っ込むと、そのままwebブラウザのようにレンダリングしてくれる。何のエンジンを使っているかは不明だけど、とりあえずそのまま突っ込んでみたらfont colorやimgは読み込めていた。<br /><br />
で、そのままだとchumbyの画面には文字が小さすぎるのでfont size=&#8221;22&#8243;ぐらいまで大きくしたいんだけどAS2に正規表現などがなかったのでsplitと<a href="http://gmx.selfip.com/2007/03/post_14.html">strReplace</a>でがんばった。</p>
<ul>
<li><a href="http://d.hatena.ne.jp/shokai/20080510/1210415289">ダイナミックテキストにHTML表示 &#8211; shokaiの日記</a></li>
</ul>
<p>あとCDATA内のHTMLは＞が＆ｇｔ；のように実体参照になっているが、それを変換するメソッドがAS2に無かった。<br /><br />
無かったのだが、ダイナミックテキストのhtmlTextプロパティに代入してからtextプロパティから読み直すとなぜか変換されている事を発見、解決した。</p>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/1539/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>chumbyで日本語TwitterにIPAフォントを埋め込んだ</title>
		<link>http://shokai.org/blog/archives/1538</link>
		<comments>http://shokai.org/blog/archives/1538#comments</comments>
		<pubDate>Sun, 18 May 2008 22:58:07 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[AS2]]></category>
		<category><![CDATA[chumby]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=1538</guid>
		<description><![CDATA[Flashにフォントそのものを埋め込むのはライセンス的にどうなのかよくわからなかったのでchumbyで日本語twitterの時はswfの公開はしていなかったのだけど、IPAフォントならライセンス的にokだとわかったので埋 [...]]]></description>
			<content:encoded><![CDATA[<p>
<p>Flashにフォントそのものを埋め込むのはライセンス的にどうなのかよくわからなかったので<a href="http://shokai.org/blog/archives/1535">chumbyで日本語twitter</a>の時はswfの公開はしていなかったのだけど、<a href="http://ossipedia.ipa.go.jp/ipafont/">IPAフォント</a>ならライセンス的にokだとわかったので埋め込んで再公開しました。</p>
<p>これでFlash CS3を持っていない人も、chumbyでTwitterを日本語で読めますね！！<br /><br />
ダウンロード → <a href="http://shokai.org/archive/chumby/080509_Twitter/">Chumby Twitter Widget (AS2 / Flash CS)</a></p>
<p><a href="http://www.flickr.com/photos/shokai/2483811422/" title="DSCF2213 by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3287/2483811422_6b7a7e9493.jpg" width="500" height="375" alt="DSCF2213" /></a></p>
<p>設定の仕方は変更無し。<br /><br />
<a href="http://shokai.org/blog/archives/1535">s.h.log  chumbyで日本語Twitterを読めるwidgetを作った</a></p>
</p>
<blockquote><p><p>profile.xmlのusernumの数値を、自分のtimeline用に書き換える。これはtwitter上でのID。<br /><br />
twitter.com/homeで、自分のRSSフィードを見ると 123456.atom みたいな感じになっているので、その数値に書き換える。<br /><br />
intervalの秒数だけ、次の記事を読むまでwaitがかかる。デフォルトは8秒。</p></p></blockquote>
<p>
<p>そして<a href="http://shokai.org/blog/archives/1534">USBメモリから起動</a>してください<br /><br />
ちなみにこないだchumby用に、<a href="http://www.amazon.co.jp/exec/obidos/ASIN/B000T8NR26/shokai-22">PQI製の超小さいUSBメモリ</a>を買ったんだけど相性なのか、認識しなかった。MacBookでは普通に使えているので、財布にも入るサイズだし重宝してるけどどうしようかなあ…USBメモリが正直邪魔だ。</p>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/1538/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>chumbyでLDR未読数を表示するwidget</title>
		<link>http://shokai.org/blog/archives/1537</link>
		<comments>http://shokai.org/blog/archives/1537#comments</comments>
		<pubDate>Sat, 17 May 2008 20:35:56 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[AS2]]></category>
		<category><![CDATA[chumby]]></category>
		<category><![CDATA[crossdomain]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=1537</guid>
		<description><![CDATA[LDR unread countがchumby.comのwidgetとして公開された。 Livedoor Readerのアカウント名を設定すると、未読数が表示されて焦らされるが、1万超えたあたりからどうでもよくなった。  [...]]]></description>
			<content:encoded><![CDATA[<p>
<p><a href="http://www.chumby.com/guide/widget/LDR%20unread%20count">LDR unread count</a>がchumby.comのwidgetとして公開された。<br /><br />
Livedoor Readerのアカウント名を設定すると、未読数が表示されて焦らされるが、1万超えたあたりからどうでもよくなった。<br /><br />
アップロードしたwidgetは基本privateで、publicにした後審査が入ってwidgetsの検索画面から他のユーザに使ってもらえるようになる。今回はだいたい4時間ぐらいで審査が通ったみたい。</p>
<p><a href="http://www.flickr.com/photos/shokai/2482978825/" title="DSCF2199 by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3031/2482978825_8b0597c123.jpg" width="500" height="375" alt="DSCF2199" /></a></p>
<p>ダウンロード → <a href="http://shokai.org/archive/chumby/080518_ldrunread/">SourceCode(Flash AS2 / CS3)</a></p>
<p>（うおお、前の記事書いてから1週間たってる・・・）<br /><br />
前のTwitter widgetより前に作って投稿してあったものなんだけど、これは数字が出るだけなので、Flash的にも手抜き。</p>
<p>Flashは手抜きだけど、chumby widget固有のノウハウである<br /><br />
１．クロスドメイン許可されていない外部のサーバーのデータを読みに行く<br /><br />
２．chumby.comにデータを保存できる設定画面を作る<br /><br />
３．chumby.comに保存したデータをwidgetから読み込む</p>
<p>という事をやってみたので、まとめておこう。</p>
<p>■１．クロスドメイン許可されていない外部のサーバーのデータを読みに行く<br /><br />
Livedoor Readerの未読数を取得するAPIを使う。</p>
<ul>
<li><a href="http://d.hatena.ne.jp/hnw/20080122">LDRユーザーは仕事サボってるのがバレバレな件 &#8211; hnwの日記</a></li>
</ul>
<p>パラメータに<a href="http://rpc.reader.livedoor.com/notify?user=shokaishokai">user=shokaishokai</a>などすると未読数が出てくる。<br /><br />
特にXMLとかではないので、AS2の場合LoadVarsを使えば良い。</p>
<ul>
<li><a href="http://d.hatena.ne.jp/shokai/20080509/1210281896">LoadVarsでテキストデータを読み込んでLDR未読数を取得 &#8211; shokaiの日記</a></li>
</ul>
<p>ローカルドメインで動かす分にはこれで構わないが、セキュリティの事もあってサーバーに置いてあるFlashは別のサーバーにあるデータを読みに行く事ができないようになっている。そのため、rpc.reader.livedoor.comを読みに行けない。<a href="http://shokai.org/blog/archives/1535">前のtwitterで使った</a>XMLクラスなんかは例外。</p>
<p>そのため、大学院棟のサーバーにchumby.comからのアクセスを許可するcrossdomain.xmlを置いて、RubyでproxyするCGIを置いてそれをchumby上のFlashから読むようにした。</p>
<p><a href="http://shokai.mag.keio.ac.jp/crossdomain.xml">crossdomain.xml</a><br /><br />
<code><?xmlversion="1.0"encoding="UTF-8"?><br /><br />
<!DOCTYPEcross-domain-policySYSTEM"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"><br /><br />
<cross-domain-policy><br /><br />
<allow-access-fromdomain="*.chumby.com"/><br /><br />
</cross-domain-policy></code><br /><br />
*.chumby.com からのアクセスのみ許可すればよい</p>
<p>このサーバーにRuby適当に作ったproxyを置いて、Flashから読ませる。</p>
<ul>
<li><a href="http://d.hatena.ne.jp/shokai/20080509/1210298859">proxy &#8211; shokaiの日記</a></li>
</ul>
<p>これで外部ドメインのデータを読めるようになった。</p>
<p>■２．chumby.comにデータを保存できる設定画面を作る<br /><br />
widgetの管理画面で、設定値を入力するダイアログを出すようにした。<br /><br />
データはchumby.comに保存され、自作widgetがchumby上でロードされたしばらく後に設定値が_root直下の変数として現れるという仕様らしい。<br /><br />
<a href="http://www.flickr.com/photos/shokai/2478472624/" title="LDR unread count customize by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3209/2478472624_7f5b44a754_o.png" width="508" height="462" alt="LDR unread count customize" /></a></p>
<p>この辺のドキュメントを参考にした。</p>
<ul>
<li><a href="http://wiki.chumby.com/mediawiki/index.php/Developing_widgets_for_chumby#Widget_Configuration_Dialog">Developing widgets for chumby &#8211; ChumbyWiki</a></li>
<li><a href="http://wiki.chumby.com/mediawiki/index.php/Widget_Parameter_Example">Widget Parameter Example &#8211; ChumbyWiki</a></li>
<li><a href="http://www.adobe.com/devnet/devices/articles/chumby_development_04.html">Adobe &#8211; Developer Center : Developing widgets for Chumby with Flash Lite 3</a></li>
</ul>
<p>サイズは320&#215;240 pixelで、<a href="http://wiki.chumby.com/mediawiki/index.php/Widget_Parameter_Example">Sample Parameter Example(AS2)</a>に同梱されてた com.Chumby.WidgetParams.as を使うのが楽らしいので作ってみた<br /><br />
→ <a href="http://shokai.org/archive/chumby/080518_ldrunread/LdrUnread/configure.fla">configure.fla</a><br /><br />
まあ今回はユーザ名を保存するだけなのでサンプルを削っただけなんだけど、送信が終わったらgetURLでjavascriptを呼んで自分自身を閉じたりとかしていて面白い。</p>
<p>■３．chumby.comに保存したデータをwidgetから読み込む<br /><br />
chumby.comに保存されたデータは、widgetが画面に読み込まれてからしばらくたってから、_rootに現れる。<br /><br />
どうやら毎回読み込みに行っているらしい。</p>
<p>値が_rootに現れるまで待たないと、undefinedになってしまうので待つ。<br /><br />
<code>this.onEnterFrame=function(){<br /><br />
if(username==null)return;//待ちます<br /><br />
ldr_loadUnread(username);<br /><br />
deletethis.onEnterFrame<br /><br />
}</code></p>
<p>こんな感じで、chumby+サーバーサイドができました。</p>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/1537/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>chumbyで日本語Twitterを読めるwidgetを作った</title>
		<link>http://shokai.org/blog/archives/1535</link>
		<comments>http://shokai.org/blog/archives/1535#comments</comments>
		<pubDate>Fri, 09 May 2008 10:36:22 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[AS2]]></category>
		<category><![CDATA[chumby]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[XPath4AS2]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=1535</guid>
		<description><![CDATA[chumbyは日本語フォントが入っていないので日本語が表示できないが、Flashの中のダイナミックテキストそのものにフォントを埋め込めば日本語が出せる。 Chumby Japan チャンビー・ジャパン: もうすぐ日本語表 [...]]]></description>
			<content:encoded><![CDATA[<p>
<p><a href="http://www.chumby.com/">chumby</a>は日本語フォントが入っていないので日本語が表示できないが、Flashの中のダイナミックテキストそのものにフォントを埋め込めば日本語が出せる。</p>
<ul>
<li><a href="http://chumbyjapan.com/blog/2008/03/post.html">Chumby Japan チャンビー・ジャパン: もうすぐ日本語表示が可能に？</a></li>
<li><a href="http://d.hatena.ne.jp/marqs/20080313/p1">Chumby Widgetで日本語表示 &#8211; marqs blog</a></li>
</ul>
<p>ちょうどIMのAPIが動いてなかったので、twitterのfriends timelineを表示するchumby widgetを作ってみた。ただしフォントデータそのものを埋め込んで配布するのはライセンス的にまずそうなので、flaファイルのみの公開になります。自分の環境でコンパイルしてください<a href="http://shokai.org/blog/archives/1538">IPAフォントを埋め込んで、swfも公開しました</a></p>
<p>ダウンロード → <a href="http://shokai.org/archive/chumby/080509_Twitter/">SourceCode (Flash CS3 / AS2)</a></p>
<p>（AS2が久しぶりすぎてやばかった）</p>
<p><a title="twitter on chumby by shokai, on Flickr" href="http://www.flickr.com/photos/shokai/2478168816/"><img src="http://farm4.static.flickr.com/3008/2478168816_6df672331e_o.jpg" alt="twitter on chumby" width="240" height="320" /></a></p>
<p>ただしこの方法だとファイルサイズが100kb（chumby widgetの容量制限）を超えるので、USBから起動するしかない。<br /><br />
→ <a href="http://shokai.org/blog/archives/1534">s.h.log  chumbyで自作widgetをUSBメモリから起動する</a></p>
<p><a title="japanese twitter on chumby by shokai, on Flickr" href="http://www.flickr.com/photos/shokai/2477030617/"><img src="http://farm3.static.flickr.com/2107/2477030617_90f403fbf4_o.png" alt="japanese twitter on chumby" width="332" height="290" /></a></p>
<p>■<a href="http://shokai.org/archive/chumby/080509_Twitter/Twitter/profile.xml">profile.xml</a><br /><br />
profile.xmlのusernumの数値を、自分のtimeline用に書き換える。これはtwitter上でのID。<br /><br />
twitter.com/homeで、自分のRSSフィードを見ると 123456.atom みたいな感じになっているので、その数値に書き換える。</p>
<p>intervalの秒数だけ、次の記事を読むまでwaitがかかる。デフォルトは8秒。</p>
<p>■Twitter APIをAS2で読む<br /><br />
<a href="http://www.xfactorstudio.com/">XPath4AS2</a>でxml版のフィードを読んだ。<br /><br />
FlashでBasic認証を通る方法がわからなかったので、protectをかけているユーザのtimelineは読めないかも知れない。<br /><br />
前に作ったXPath4AS2テスターが役に立った。</p>
<ul>
<li><a href="http://shokai.org/blog/archives/1130">s.h.log  Flash &#8211; XPath4AS2でXPathテスター</a></li>
<li><a href="http://shokai.org/blog/archives/1132">s.h.log  FlashでFlickr REST-APIを呼ぶ</a></li>
<li><a href="http://www.trick7.com/blog/2006/09/28-092340.php">trick7.com blog: xfactorstudioのXPath4AS2の使い方</a></li>
</ul>
<p>■favorite<br /><br />
どうしてもふぁぼりたかったんだけど、FlashからBasic認証を通る事ができなくて無理だった。<br /><br />
http://user:pass@twitter.comの方法も、Base64エンコードしてLoadVarsにaddRequestHeaderするのも、getURLも駄目。<br /><br />
ブラウザの中で動いているわけではないのでログイン済みのcookieを共有するも出来ない。<br /><br />
cgiでproxyすればいいんだけど。</p>
<p>■thumbnail<br /><br />
USBから起動した場合、サムネイルが読めない。<br /><br />
同じ画像ファイルでwebにアップした場合は読めたので、profile.xmlの記述ミスかも。</p>
<p>■setIntervalがおかしい<br /><br />
PC上で実行している時は問題ないんだけど、ChumbyのFlashLite3上でsetIntervalを使ってタイマ処理を行っている時、4秒以上待てない。10秒などを指定すると、4秒ぐらいでタイマ処理が回ってしまう。調べても特にFlashLiteは特別という記述は見あたらなかったので、なんだかわからないけど、さすがに4秒はchumbyから目を離せなくなってしまうので今回は1秒を数えるsetIntervalを作ってさらにカウントアップする変数を用意して、時間を数えるようにした。</p>
<p>■プログラム<br /><br />
全部<a href="http://shokai.org/archive/chumby/080509_Twitter/Twitter/twitter.fla">twitter.fla</a>の1フレーム目に書いた</p>
</p>
<blockquote><p><p>
importcom.xfactorstudio.xml.xpath.*;</code></p>
<p>if(!interval)interval=10;<br /><br />
if(!usernum)usernum=3631571;</p>
<p>vartwitterXml:XML=newXML();<br /><br />
twitterXml.ignoreWhite=false;</p>
<p>varxmlUrl="http://twitter.com/statuses/friends_timeline/"+usernum+".xml";</p>
<p>twitterXml.onLoad=twitterXml_onLoad;<br /><br />
twitterXml.load(xmlUrl);</p>
<p>varint_id;<br /><br />
functiontwitterXml_onLoad(success:Boolean){<br /><br />
if(success){<br /><br />
trace("XMLloadsuccess!!");<br /><br />
loading._visible=false;<br /><br />
preLoadIcon(twitterXml);<br /><br />
int_id=setInterval(count_sec,1000);<br /><br />
loadNextStat();<br /><br />
}<br /><br />
else{<br /><br />
trace("XMLloaderror!!");<br /><br />
}<br /><br />
}</p>
<p>functionpreLoadIcon(stats:XML){<br /><br />
//trace(stats);<br /><br />
varicons:Array=XPath.selectNodes(stats,"statuses/status/user/profile_image_url/text()");<br /><br />
trace(icons.length);<br /><br />
for(vari:Number=0;i&lt;icons.length;i++){<br /><br />
varloader=newmx.controls.Loader();<br /><br />
loader.contentPath=icons[i];<br /><br />
//loader.load();<br /><br />
//trace(loader.autoLoad);<br /><br />
trace(loader.contentPath);<br /><br />
}<br /><br />
}</p>
<p>varstat_id=0;<br /><br />
varfav="false";<br /><br />
functionloadStats(stats:XML,num:Number){<br /><br />
varlen=XPath.selectNodes(stats,"statuses/status").length;<br /><br />
if(num&gt;len){<br /><br />
clearInterval(int_id);<br /><br />
loading._visible=true;<br /><br />
twitterXml.load(xmlUrl);<br /><br />
n=1;<br /><br />
return;<br /><br />
}<br /><br />
varupdate=XPath.selectNodes(stats,"statuses/status["+num+"]/text/text()");<br /><br />
fav=XPath.selectNodes(stats,"statuses/status["+num+"]/favorited/text()");<br /><br />
variconUrl=XPath.selectNodes(stats,"statuses/status["+num+"]/user/profile_image_url/text()");<br /><br />
varuserName=XPath.selectNodes(stats,"statuses/status["+num+"]/user/name/text()");<br /><br />
varscreenName=XPath.selectNodes(stats,"statuses/status["+num+"]/user/screen_name/text()");<br /><br />
vardate=XPath.selectNodes(stats,"statuses/status["+num+"]/created_at/text()");<br /><br />
stat_id=XPath.selectNodes(stats,"statuses/status["+num+"]/id/text()");<br /><br />
iconLoader.contentPath=iconUrl;<br /><br />
//favStar.gotoAndStop(fav);//labelで移動<br /><br />
labelUpdate.text=update;<br /><br />
labelUserName.text=userName+"("+screenName+")";<br /><br />
labelDate.text=date;<br /><br />
trace(fav);<br /><br />
}</p>
<p>varsec=0;<br /><br />
functioncount_sec(){<br /><br />
sec++;<br /><br />
if(sec&gt;=interval){<br /><br />
sec=0;<br /><br />
loadNextStat();<br /><br />
}<br /><br />
}</p>
<p>varn=1;<br /><br />
functionloadNextStat(){<br /><br />
trace("loadNextStat");<br /><br />
loadStats(twitterXml,n++);<br /><br />
}<br />
</p></p></blockquote>
<p>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/1535/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>chumbyで自作widgetをUSBメモリから起動する</title>
		<link>http://shokai.org/blog/archives/1534</link>
		<comments>http://shokai.org/blog/archives/1534#comments</comments>
		<pubDate>Thu, 08 May 2008 19:59:02 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[AS2]]></category>
		<category><![CDATA[chumby]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=1534</guid>
		<description><![CDATA[MakerFaireで買ってきたchumbyにFlashLite3が入っていて、ActionScript2.0が動く。 ちょうど良い事に俺がFlasherなので、自分でwigetを作って動かしてみた。 yoggyさんに教 [...]]]></description>
			<content:encoded><![CDATA[<p>
<p>MakerFaireで買ってきた<a href="http://www.chumby.com/">chumby</a>にFlashLite3が入っていて、ActionScript2.0が動く。<br /><br />
ちょうど良い事に俺がFlasherなので、自分でwigetを作って動かしてみた。</p>
<p>yoggyさんに教えてもらった<a href="http://www.scottjanousek.com/">Scott Janousek</a>さんのスライドが凄くまとまっている。chumby独自の変数（内蔵の加速度センサー、タッチパネル等）の取得の仕方なども書いてある<br /><br />
→ <a href="http://www.slideshare.net/scottjanousek/developing-flash-lite-widgets-for-the-chumby-platform">Developing Flash Lite Widgets For The Chumby Platform  SlideShare</a></p>
<p>あと、Scottさんの作ったFlash CS3用のデバイスプロファイルを入れると、ケータイ用Flashを試すエミュレータであるAdobe Device Centralでchumbyが動く様になる。<br /><br />
<a href="http://www.scottjanousek.com/blog/2007/11/22/chumby-device-profile-for-adobe-device-central-cs3/">Scott Janousek  Blog Archive  Chumby Device Profile for Adobe Device Central CS3</a></p>
<p>■USBメモリで動かす<br /><br />
<a href="http://www.chumby.com/widgets/upload">chumby.comのsubmit a widget</a>からprivate設定でuploadして試す方法もあるが、ローカルで開発する方法としてUSBメモリからブートする方法もある。今回はUSBメモリが余っていたのでそれでやってみた。</p>
<p><a href="http://wiki.chumby.com/mediawiki/index.php/Chumby_tricks#Mixing_local_widgets_into_a_channel">Chumby tricks &#8211; ChumbyWiki &#8211; Mixing local widgets into a channel</a><br /><br />
を参考に、USBメモリの中に<a href="http://shokai.org/archive/chumby/080509_usbsample/profile.xml">profile.xml</a>というファイルを置くと、USBメモリ内のswfを読み込まれる。</p>
<p><a title="chumby usb boot by shokai, on Flickr" href="http://www.flickr.com/photos/shokai/2476809036/"><img src="http://farm3.static.flickr.com/2178/2476809036_83d366f363_o.png" alt="chumby usb boot" width="335" height="212" /></a></p>
<p>→<a href="http://shokai.org/archive/chumby/080509_usbsample/">USBメモリに入れたファイル(Flash AS2 / CS3)</a></p>
<p>FlashはFlashLite3とのことだったんだけど、<a href="http://wiki.chumby.com/mediawiki/index.php/Sample_Accelerometer_Widget">ChumbyWikiのwidgetサンプル</a>を見たら、みんなパブリッシュ設定でFlashPlayer6 + AS1.0の組み合わせを指定していた。なんとなくAS1は嫌だったので俺はFlashPlayer6+AS2.0で書き出してみた。</p>
<p>そして、USBメモリを刺して動かしてみた結果がこれだよ！<br /><br />
channelのreloadをすれば読み込まれた。</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="300" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="flashvars" value="intl_lang=en-us&#038;photo_secret=a39c7b94a9&#038;photo_id=2476818622" /><param name="bgcolor" value="#000000" /><param name="allowFullScreen" value="true" /><param name="src" value="http://www.flickr.com/apps/video/stewart.swf?v=49235" /><embed type="application/x-shockwave-flash" width="400" height="300" src="http://www.flickr.com/apps/video/stewart.swf?v=49235" allowfullscreen="true" bgcolor="#000000" flashvars="intl_lang=en-us&#038;photo_secret=a39c7b94a9&#038;photo_id=2476818622"></embed></object></p>
<p>あと、<a href="http://shokai.org/archive/chumby/080509_usbsample/profile.xml">profile.xml</a>でwidget_parameterタグで値を渡す事ができる。<br /><br />
上のビデオではやってなかったけど、例えば適当なダイナミックテキストを置いて<br /><br />
<code>labelParam1.text = param1;</code><br /><br />
などとすれば、下のprofile.xmlだったら zanmai というテキストが読み込める。この辺は<a href="http://shokai.org/blog/archives/1065">FlashをActiveX Objectとして埋め込む</a>時に使うSetVariableとかと同じ感じ。</p>
<p>profile.xml<code><profile><br />
<widget_instances><br /><br />
<widget_instance id="1"><br /><br />
<widget><br /><br />
<name>Test Widget</name><br /><br />
<description>this is test widget hellohello</description><br /><br />
<version>1.0</version><br /><br />
<mode time="30" mode="timeout"/><br /><br />
<access sendable="false" deleteable="false" access="private" virtualable="false"/><br /><br />
<user username="myusername"/><br /><br />
<thumbnail href="file:////mnt/usb/thumb.jpg" contenttype="image/jpeg"/><br />
<movie href="file:////mnt/usb/test.swf" contenttype="application/x-shockwave-flash"/><br /><br />
</widget><br /><br />
<access access="private"/><br /><br />
<mode time="30" mode="timeout"/><br /><br />
<widget_parameters><br /><br />
<widget_parameter><br /><br />
<name>param1</name><br /><br />
<value>zanmai</value><br /><br />
</widget_parameter><br /><br />
<widget_parameter><br /><br />
<name>param2</name><br /><br />
<value>kazusuke</value><br /><br />
</widget_parameter><br /><br />
</widget_parameters><br /><br />
</widget_instance><br /><br />
</widget_instances><br /><br />
</profile><br />
</code></p>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/1534/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RailsにFlashからpostしたり取り出したりする</title>
		<link>http://shokai.org/blog/archives/1509</link>
		<comments>http://shokai.org/blog/archives/1509#comments</comments>
		<pubDate>Fri, 28 Mar 2008 23:56:13 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://shlog.sakura.ne.jp/blog/?p=1509</guid>
		<description><![CDATA[Railsのscaffoldでさくっと作ったインタフェースって、HTTP-POSTからSQLに保存したり取り出したりもできて色々プロトタイプを作るのに便利なのでまとめておく。 ためたデータの管理もできるし。 ■Rails [...]]]></description>
			<content:encoded><![CDATA[<p>
<p>Railsのscaffoldでさくっと作ったインタフェースって、HTTP-POSTからSQLに保存したり取り出したりもできて色々プロトタイプを作るのに便利なのでまとめておく。<br /><br />
ためたデータの管理もできるし。</p>
<p>■Rails側の準備<br /><br />
まずrailsを入れる。<br /><br />
Macの人は既に入っているはず。Windowsなら、ActiveScriptRubyを入れてパス通すと、gemコマンドが入るのでgem install railsすればrailsコマンドが使えるようになる。DBは<a href="http://www.sqlite.org/download.html">SQLiteのdll版</a>をc:\windows\system32に入れればできる様になるはず。</p>
<p>railsでtestbbsというプロジェクトを作って、そこにscaffoldでentry(投稿)というmodelを作る。entryには、name（投稿者）とmessage（本文）が入る。</p>
</p>
<blockquote><p><p>rails testbbs<br /><br />
cd testbbs<br /><br />
ruby script/generate scaffold entry name:string message:text<br /><br />
rake db:migrate</p></p></blockquote>
<p>
<p>（単数形に注意）</p>
<p>webサーバーを立ち上げる</p>
</p>
<blockquote><p><p>ruby script/server</p></p></blockquote>
<p>
<p><a href="http://localhost:3000/entries">http://localhost:3000/entries</a>から見れるようになっている。はず。（複数形に注意）</p>
<p>こんなページができている。ここからentryを増やしたり消したりもできる。<br /><br />
<a href="http://www.flickr.com/photos/shokai/2369280169/" title="post from flash to rails by shokai, on Flickr"><img src="http://farm3.static.flickr.com/2099/2369280169_c2465cd6e0_o.png" width="377" height="228" alt="post from flash to rails" /></a></p>
<p>ここまでで、<a href="http://localhost:3000/entries/new">http://localhost:3000/entries/new</a>から投稿できるのと、<a href="http://localhost:3000/entries.xml">http://localhost:3000/entries.xml</a>から一覧を取得できるようになった。</p>
<p>→<a href="http://shokai.org/archive/ruby/rails/0803_testbbs/">Source Code (Ruby on Rails 2.0.2)</a></p>
<p>■Flashから投稿する<br /><br />
HTTP POSTで行う。</p>
<p>今回作ったもの（動きます）<br /><br />
<object width="410" height="200"><param name="movie" value="http://shokai.org/archive/as3/0803_HTTP/HttpPost.swf"></param><embed src="http://shokai.org/archive/as3/0803_HTTP/HttpPost.swf" type="application/x-shockwave-flash" width="410" height="200"></embed></object></p>
<p><a href="http://shokai.org/archive/as3/0803_HTTP/">Source Code (AS3 / Flash CS3 + Flashdevelop)</a><br /><br />
今回もFlashDevelop上でAS3書いて、FlashCS3オーサリング/コンパイルした。</p>
<p>こいつでPOSTすると、<a href="http://localhost:3000/entries">http://localhost:3000/entries</a>に結果が出るようになる。<br /><br />
<a href="http://www.flickr.com/photos/shokai/2369259181/" title="post from flash to rails by shokai, on Flickr"><img src="http://farm3.static.flickr.com/2238/2369259181_201a21aaba_o.png" width="368" height="298" alt="post from flash to rails" /></a></p>
<p>どうやってるかというとまず<br /><br />
<a href="http://localhost:3000/entries/new">http://localhost:3000/entries/new</a>を見ると</p>
</p>
<blockquote><p><p><formaction="/entries"class="new_entry"id="new_entry"method="post"><divstyle="margin:0;padding:0"><inputname="authenticity_token"type="hidden"value="a360f92a6a91d6c588d319f1ab475e9abbb22d9d"/></div>
<p>
<b>Name</b><br/>
<inputid="entry_name"name="entry[name]"size="30"type="text"/>
</p></p>
<p><p>
<b>Message</b><br/></p>
<p><textareacols="40"id="entry_message"name="entry[message]"rows="20"></textarea>
</p></p>
<p><p>
<inputid="entry_submit"name="commit"type="submit"value="Create"/>
</p>
</form>
</p></p></blockquote>
<p>
<p>という風にPOSTしているので、entry[name]とentry[message]をパラメータで渡せばいいとわかる。</p>
<p><span id="more-1509"></span><br /><br />
AS3でhttp postする</p>
<p><a href="http://shokai.org/archive/as3/0803_HTTP/HttpPost.as">HttpPost.as</a><br /><br />
</p>
<blockquote><p>varparams:URLVariables=newURLVariables();<br /><br />
params.decode(&#8220;entry[name]=&#8221;+_textInputName.text);<br /><br />
params.decode(&#8220;entry[message]=&#8221;+_textAreaPost.text);</p>
<p>varrequest:URLRequest=newURLRequest(&#8220;http://localhost:3000/entries&#8221;);<br /><br />
request.method=URLRequestMethod.POST;<br /><br />
request.data=params;<br /><br />
varurlLoader:URLLoader=newURLLoader();<br /><br />
urlLoader.dataFormat=URLLoaderDataFormat.VARIABLES;</p>
<p>urlLoader.load(request);</p></p></blockquote>
<p>
<p>（Railsの複数形・単数形の変化は注意）<br /><br />
。</p>
<p>返り値を受け取るには、<br /><br />
関数を宣言して<br /><br />
</p>
<blockquote><p>publicfunctiononPostComplete(e:Event):void{<br /><br />
varparams:URLVariables=newURLVariables(e.target.data);<br /><br />
trace(&#8220;received:&#8221;+unescape(params.toString()));<br /><br />
}</p></p></blockquote>
<p>
<p>関数をURLLoaderのインスタンスに登録しておけばいい</p>
</p>
<blockquote><p><p>urlLoader.addEventListener(Event.COMPLETE,onPostComplete);//post完了イベントに関数登録</p></p></blockquote>
<p>
<p>今回帰ってきた値。HTMLだ。<br /><br />
</p>
<blockquote><p>postfromflash<br /><br />
received:<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"<br /><br />
&#8220;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#8221;></p>
<p><htmlxmlns="http://www.w3.org/1999/xhtml"xml:lang="en"lang="en"><br /><br />
<head><br /><br />
<metahttp-equiv="content-type"content="text/html;charset=UTF-8"/><br /><br />
<br /><br />
<linkhref="/stylesheets/scaffold.css?1206748225"media="screen"rel="stylesheet"type="text/css"/><br />
</head><br /><br />
<body></p>
<p><pstyle="color:green">Entrywassuccessfullycreated.</p></p>
<p><p><br />
<b>Name:</b><br /><br />
shokai<br /><br />
</p></p>
<p><p><br />
<b>Message:</b><br /><br />
postfromflash<br /><br />
</p></p>
<p><ahref="/entries/2/edit">Edit</a>|<br /><br />
<ahref="/entries">Back</a></p>
<p></body><br /><br />
</html><br />
</p></p></blockquote>
<p>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/1509/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AS3 &#8211; あらためてラベリング処理</title>
		<link>http://shokai.org/blog/archives/1490</link>
		<comments>http://shokai.org/blog/archives/1490#comments</comments>
		<pubDate>Wed, 30 Jan 2008 17:03:11 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[画像処理]]></category>

		<guid isPermaLink="false">http://shlog.sakura.ne.jp/blog/?p=1490</guid>
		<description><![CDATA[火曜に、imglのうっちーとあらためてラベリング処理ってどうやんのよという話をしていて、あらためてAS3で書き直した。 ただし、ラベルの衝突処理はまだやっていない。 ラベリング処理について→s.h.log: Proce5 [...]]]></description>
			<content:encoded><![CDATA[<p>
<p>火曜に、imglのうっちーとあらためてラベリング処理ってどうやんのよという話をしていて、あらためてAS3で書き直した。<br /><br />
ただし、ラベルの衝突処理はまだやっていない。</p>
<p>ラベリング処理について→<a href="http://web.sfc.keio.ac.jp/~shokai/archives/2007/06/proce55ing-binarize-labeling.html">s.h.log: Proce55ing &#8211; 2値化画像を4近傍ラベリング処理してパーツ抜き出し</a></p>
<p>今まで、ラベルそのものを2次元のint配列で管理してたけど、今回はBitmapDataオブジェクトとして保存する様にしてみた。BitmapDataならx,y座標で要素にアクセスできるし、ピクセルはuint型なので都合がいい。</p>
<p>■できたもの<br /><br />
download => <a href="http://shokai.org/archive/as3/080129_labeling/">fla, as, swf (FlashDevelop3.0.0 Beta5 + FlashCS3)</a></p>
<p><a href="http://web.sfc.keio.ac.jp/~shokai/archives/2008/01/post_726.html">年末年始作ったカメラから画像処理のサンプル</a>を元に改造した。<br /><br />
webcamから撮影してBitmapDataにして、1ピクセルずつ走査して真っ白（0x00FFFFFF）のピクセルを検出。<br /><br />
さらにラベリング処理をして、「ピクセルのかたまり」毎に番号をつける。</p>
<p>（0x00FFFFFFは蛍光灯を撮影すると良いです）<br /><br />
<a href="http://www.flickr.com/photos/shokai/2231166650/" title="labeling by shokai, on Flickr"><img src="http://farm3.static.flickr.com/2160/2231166650_daa29aed6b_o.png" width="422" height="250" alt="labeling" /></a><a href="http://www.flickr.com/photos/shokai/2230373719/" title="labeling by shokai, on Flickr"><img src="http://farm3.static.flickr.com/2176/2230373719_b3653fa3ca_o.png" width="422" height="250" alt="labeling" /></a><a href="http://www.flickr.com/photos/shokai/2230374593/" title="labeling by shokai, on Flickr"><img src="http://farm3.static.flickr.com/2118/2230374593_11a7b53936_o.png" width="422" height="250" alt="labeling" /></a></p>
<p>今回はノイズを飛ばしたりしていないので、右の本棚の小さな白にも反応してしまって28個とか検出される<br /><br />
<a href="http://www.flickr.com/photos/shokai/2230377983/" title="labeling by shokai, on Flickr"><img src="http://farm3.static.flickr.com/2357/2230377983_a63a9d3bc2_o.png" width="422" height="250" alt="labeling" /></a></p>
<p>ラベルの衝突時の処理もしていないので、左上が空いた弧の様な形の時に割れてしまう<br /><br />
<a href="http://www.flickr.com/photos/shokai/2230391701/" title="labeling by shokai, on Flickr"><img src="http://farm3.static.flickr.com/2154/2230391701_8ae1deeb31_o.png" width="422" height="250" alt="labeling" /></a><br /><br />
この辺はまたの機会に。</p>
<p><span id="more-1490"></span><br /><br />
■動きます（USBカメラが必要）<br /><br />
<object width="410" height="200"><param name="movie" value="http://shokai.org/archive/as3/080129_labeling/ColorPicker.swf"></param><embed src="http://shokai.org/archive/as3/080129_labeling/ColorPicker.swf" type="application/x-shockwave-flash" width="410" height="200"></embed></object></p>
<p>■コード<br /><br />
<a href="http://shokai.org/archive/as3/080129_labeling/ColorPicker.as">ColorPicker.as</a><br /><br />
</p>
<blockquote><p>package{<br /><br />
importfl.controls.Button;<br /><br />
importfl.controls.NumericStepper;<br /><br />
importflash.events.*;<br /><br />
importflash.media.*;<br /><br />
importflash.geom.Point;<br /><br />
importflash.utils.*;<br /><br />
importflash.display.*;<br /><br />
importflash.filters.*;<br /><br />
publicclassColorPickerextendsSprite{<br /><br />
privatevarcam:Camera;//カメラ<br /><br />
privatevarvideo:Video;//カメラからの画像を表示<br /><br />
privatevarbmp:Bitmap;//表示<br /><br />
privatevarbmd:BitmapData;//中身のデータ<br /><br />
privatevarlabels:BitmapData;//bmdと同サイズのラベル<br /><br />
privatevarcolor:int=0x00ffffff;//選択する色(白)<br /><br />
<br /><br />
privatevar_numericStepperLabelNum:NumericStepper;<br /><br />
privatevar_buttonSnapshot:Button;<br /><br />
<br /><br />
/*IDEが生成したオブジェクトを関連づけ*/<br /><br />
publicfunctionlink_ide_obj(){<br /><br />
this._numericStepperLabelNum=numericStepperLabelNum;<br /><br />
this._buttonSnapshot=buttonSnapshot;<br /><br />
}<br /><br />
<br /><br />
publicfunctionColorPicker(){<br /><br />
stage.scaleMode=StageScaleMode.EXACT_FIT;//伸縮する<br /><br />
//stage.scaleMode=StageScaleMode.NO_SCALE;//伸縮しない<br /><br />
stage.align=StageAlign.TOP_LEFT;//左上から<br /><br />
<br /><br />
link_ide_obj();//IDEが生成したオブジェクトを関連づけ<br /><br />
<br /><br />
cam=Camera.getCamera();<br /><br />
cam.setMode(800,600,24,true);//24FPS<br /><br />
cam.setQuality(0,100);<br /><br />
<br /><br />
video=newVideo(200,150);//bitmap計算用の小さいビデオ<br /><br />
video.attachCamera(cam);<br /><br />
this.addChild(video);//videoを表示<br /><br />
<br /><br />
_buttonSnapshot.addEventListener(MouseEvent.CLICK,snapShot);//撮影の関数登録<br /><br />
bmd=newBitmapData(video.width,video.height);<br /><br />
bmp=newBitmap(bmd);//BitmapDataをBitampに登録<br /><br />
this.addChild(bmp);//Bitmapを表示<br /><br />
bmp.x=video.width+10;<br /><br />
<br /><br />
//ラベル番号の選択GUI<br /><br />
_numericStepperLabelNum.enabled=false;<br /><br />
_numericStepperLabelNum.addEventListener(Event.CHANGE,function(){<br /><br />
showSelectedLabel(_numericStepperLabelNum.value);<br /><br />
});<br /><br />
}<br /><br />
<br /><br />
/*撮影*/<br /><br />
publicfunctionsnapShot(e:Event){<br /><br />
bmd.draw(video);//カメラから制止画をキャプチャ<br /><br />
labeling();<br /><br />
showSelectedLabel(_numericStepperLabelNum.value);<br /><br />
_numericStepperLabelNum.enabled=true;<br /><br />
}<br /><br />
<br /><br />
/*4近傍ラベリング処理*/<br /><br />
publicfunctionlabeling(){<br /><br />
labels=newBitmapData(bmd.width,bmd.height,false,0);//transparent=false<br /><br />
varlabel:int=0;<br /><br />
varx:int,y:int;<br /><br />
bmd.lock();//表示の更新を止める。これやらないとえらい事になる<br /><br />
for(y=0;y<bmd.height;y++){<br /><br />
for(x=0;x<bmd.width;x++){<br /><br />
if(bmd.getPixel(x,y)==color){//選択した色の時（今回は白）<br /><br />
if(x>0&#038;&#038;labels.getPixel(x-1,y)>0){//左チェック<br /><br />
labels.setPixel(x,y,labels.getPixel(x-1,y));//ラベルをコピー<br /><br />
}<br /><br />
elseif(x>0&#038;&#038;y>0&#038;&#038;labels.getPixel(x-1,y-1)>0){//左上<br /><br />
labels.setPixel(x,y,labels.getPixel(x-1,y-1));<br /><br />
}<br /><br />
elseif(y>0&#038;&#038;labels.getPixel(x,y-1)>0){//上<br /><br />
labels.setPixel(x,y,labels.getPixel(x,y-1));<br /><br />
}<br /><br />
elseif(y>0&#038;&#038;x<labels.width&#038;&#038;labels.getPixel(x+1,y-1)>0){//右上<br /><br />
labels.setPixel(x,y,labels.getPixel(x+1,y-1));<br /><br />
}<br /><br />
else{//4方向いずれも隣接していない時<br /><br />
labels.setPixel(x,y,++label);//新しいラベル<br /><br />
}<br /><br />
}<br /><br />
//else{<br /><br />
//labels.setPixel(x,y,0);//ラベル無し<br /><br />
//}<br /><br />
}<br /><br />
}<br /><br />
bmd.unlock();//表示を更新する<br /><br />
<br /><br />
_numericStepperLabelNum.maximum=label;<br /><br />
_numericStepperLabelNum.minimum=1;<br /><br />
_numericStepperLabelNum.value=1;<br /><br />
}<br /><br />
<br /><br />
/*選択したラベルの箇所を青く塗る。他は赤くする*/<br /><br />
publicfunctionshowSelectedLabel(labelNum:int){<br /><br />
bmd.lock();<br /><br />
varx:int,y:int;<br /><br />
for(y=0;y<bmd.height;y++){<br /><br />
for(x=0;x<bmd.width;x++){<br /><br />
varcurrentLabel:int=labels.getPixel(x,y);<br /><br />
if(currentLabel==labelNum){<br /><br />
bmd.setPixel(x,y,0x000000FF);//青<br /><br />
}<br /><br />
elseif(currentLabel>0){<br /><br />
bmd.setPixel(x,y,0x00FF0000);//赤<br /><br />
}<br /><br />
}<br /><br />
}<br /><br />
bmd.unlock();<br /><br />
}<br /><br />
}<br /><br />
}</p></p></blockquote>
<p>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/1490/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adobe AIRの開発環境を整えて、カメラで撮影してJPEGで保存するソフトを作った</title>
		<link>http://shokai.org/blog/archives/1479</link>
		<comments>http://shokai.org/blog/archives/1479#comments</comments>
		<pubDate>Sat, 12 Jan 2008 14:20:11 +0000</pubDate>
		<dc:creator>moblog</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[JPEG]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[webcam]]></category>

		<guid isPermaLink="false">http://shlog.sakura.ne.jp/blog/?p=1479</guid>
		<description><![CDATA[AIRを使うと、flash.filesystemやflash.desktopなどのデスクトップアプリ用のクラス群が使えるようになるので、やってみた。 Air beta3で開発する環境を作って、前からやってみたかった 半透 [...]]]></description>
			<content:encoded><![CDATA[<p>
<p>AIRを使うと、flash.filesystemやflash.desktopなどのデスクトップアプリ用のクラス群が使えるようになるので、やってみた。</p>
<p>Air beta3で開発する環境を作って、前からやってみたかった<br />
<ul>
  <li>半透明で変な形をしたウィンドウ</li>
  <li>USBカメラで撮影してJPEGにエンコードしてファイル出力</li>
<ul>
を作った。<br />
<br />
<p>撮影した写真はプログラムと同じフォルダに保存される。</p>
<p>できたもの => <a href="http://shokai.org/archive/as3/0801_CameraSaveJpeg/CameraSaveJpeg/CameraSaveJpeg.air">CameraSaveJpeg.air (Adobe AIR beta3)</a>、<a href="http://shokai.org/archive/as3/0801_CameraSaveJpeg/">Archive</a></p>
<p><a href="http://www.flickr.com/photos/shokai/2187777862/" title="Air app by shokai, on Flickr"><img src="http://farm3.static.flickr.com/2246/2187777862_efbc229f0f.jpg" width="500" height="313" alt="Air app" /></a><br /><br />
なお、半透明ウィンドウにするとスクリーンショットに写らなくなるので、デジカメで撮った。</p>
<p>■開発環境を整える<br /><br />
・<a href="http://labs.adobe.com/downloads/air.html">Adobe Labs &#8211; Downloads: Adobe AIR</a><br /><br />
AIRの実行環境</p>
<p>・<a href="http://labs.adobe.com/wiki/index.php/AIR:Flash_CS3_Professional_Update">AIR:Flash CS3 Professional Update &#8211; Adobe Labs</a><br /><br />
Japaneseを選んでインストール</p>
<p>・<a href="http://www.jinten.net/blog/archives/31">Jinten Blog  Blog Archive  FlashDevelop Beta5</a><br /><br />
<a href="http://www.flashdevelop.org/">FlashDevelp3.0 Beta5</a>で、AIRとmx系クラスのコード補完を有効にする方法<br /><br />
[Project]→[Properties]→[Compiler Options]→[Intrinsic Libraries]に<br /><br />
</p>
<blockquote><p>Library\AS3\frameworks\Flex3<br /><br />
Library\AS3\frameworks\AIR</p></p></blockquote>
<p>
<p>を追加する</p>
<p>で、普通にFlashDevelopでFlash IDE用のプロジェクトを作成。<br /><br />
さらにFlashCS3からもAIRプロジェクトを作成。FlashDevelopと同じフォルダを指定する。</p>
<p>Flex3.0のコンパイラはとりあえず必要ない。</p>
<p>■証明書を作る<br /><br />
・<a href="http://www.hatayan.org/weblog/archives/2007/11/03/062950.php">AIR Beta2でWEBCAMの画像をjpgに保存するサンプル &#8211; hatayanlog</a><br /><br />
が詳しい。AIR Beta2から証明書を作らないとならなくなった。</p>
<p><span id="more-1479"></span><br /><br />
■プログラム書く<br /><br />
普通にAS3書いてflaからリンクさせてコンパイルする。<br /><br />
JPEG圧縮は<a href="http://code.google.com/p/as3corelib/">as3corelib &#8211; Google Code</a>を使った。</p>
<p>・<a href="http://geek.oyspe.com/2007/12/memo-006adobe-air-beta2.html">memo 006　Adobe AIR Beta2でデスクトップアプリケーションを作ってみる &#8211; やっぱギークでナイト！</a><br /><br />
FlashCS3上でAIRプロジェクトを作って、新しいNativeWindowを開いたり閉じたりする。<br /><br />
コードだけFlashDevelopで書くには、ドキュメントクラス名を指定してやればいい<br /><br />
<a href="http://www.flickr.com/photos/shokai/2187862038/" title="document class by shokai, on Flickr"><img src="http://farm3.static.flickr.com/2341/2187862038_edbb994d99_o.png" width="665" height="102" alt="document class" /></a></p>
<p>・<a href="http://www.adobe.com/jp/newsletters/edge/september2007/articles/article2/index.html">Adobe Edge: 2007年9月 Flash CS3 でゼロからはじめよう AIRアプリケーション作成講座 Vol.1</a><br /><br />
NativeWindowを変な形のウィンドウにする方法</p>
<p>・<a href="http://www.hatayan.org/weblog/archives/2007/11/03/062950.php">AIR Beta2でWEBCAMの画像をjpgに保存するサンプル &#8211; hatayanlog</a><br /><br />
カメラで撮影、MovieClip→BitmapData→JPEGEncoder→ByteArray→FileStreamで保存<br /><br />
あと、beta2から3でまた変わったのか、Fileまわりは</p>
</p>
<blockquote><p><p>var file:File = new File();<br /><br />
var now:Date = new Date();<br /><br />
file.nativePath = File.applicationDirectory.nativePath + File.separator + now.time + &#8220;.jpg&#8221;;</p></p></blockquote>
<p>
<p>これでアプリケーションと同じディレクトリに保存できた。</p>
<p>■ソースコード<br /><br />
<a href="http://shokai.org/archive/as3/0801_CameraSaveJpeg/CameraSaveJpeg/CameraSaveJpeg.as">CameraSaveJpeg.as</a><br /><br />
<br />
<pre class="prettyprint">
/**<br />
*&nbsp;Capture&nbsp;Image&nbsp;by&nbsp;USB-Camera&nbsp;then&nbsp;Save&nbsp;it&nbsp;as&nbsp;JPEG&nbsp;file.<br />
*&nbsp;<br />
*&nbsp;@author&nbsp;Sho&nbsp;Hashimoto<br />
*&nbsp;@version&nbsp;1.1<br />
*&nbsp;http://shokai.org<br />
*&nbsp;FlashCS3&nbsp;+&nbsp;AIR&nbsp;beta3<br />
*&nbsp;2008/01/12<br />
*/<br />
package&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;fl.controls.*;<br />
&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;flash.display.*;<br />
&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;flash.filesystem.*;<br />
&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;flash.media.*;<br />
&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;flash.events.*;<br />
&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;flash.utils.*;<br />
&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;com.adobe.images.JPGEncoder;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;CameraSaveJpeg&nbsp;extends&nbsp;MovieClip{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;cam:Camera;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;video:Video;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;_buttonShot:Button;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;_textAreaLog:TextArea;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;_buttonClose:Button;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;_bg:MovieClip;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;CameraSaveJpeg()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stage.scaleMode&nbsp;=&nbsp;StageScaleMode.EXACT_FIT;&nbsp;//&nbsp;伸縮する<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;stage.scaleMode&nbsp;=&nbsp;StageScaleMode.NO_SCALE;&nbsp;//&nbsp;伸縮しない<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stage.align&nbsp;=&nbsp;StageAlign.TOP_LEFT;&nbsp;//&nbsp;左上から<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link_ide_obj()&nbsp;//&nbsp;IDEが生成したオブジェクトを関連づけ<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cam&nbsp;=&nbsp;Camera.getCamera();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cam.setMode(800,600,24,true);//&nbsp;24FPS<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cam.setQuality(0,&nbsp;100);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;video&nbsp;=&nbsp;new&nbsp;Video(cam.width,&nbsp;cam.height);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;video.attachCamera(cam);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.addChild(video);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;video.width&nbsp;=&nbsp;200;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;video.height&nbsp;=&nbsp;150;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_bg.alpha&nbsp;=&nbsp;0.5;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_buttonShot.addEventListener(MouseEvent.CLICK,&nbsp;savePicture);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_buttonClose.addEventListener(MouseEvent.CLICK,&nbsp;window_onClose);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_bg.addEventListener(MouseEvent.MOUSE_DOWN,&nbsp;window_onMove);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;IDEが生成したオブジェクトを関連づけ&nbsp;*/<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;link_ide_obj()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this._buttonShot&nbsp;=&nbsp;buttonShot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this._textAreaLog&nbsp;=&nbsp;textAreaLog;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this._bg&nbsp;=&nbsp;bg;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this._buttonClose&nbsp;=&nbsp;buttonClose;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;現在の表示をファイルに保存&nbsp;*/<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;savePicture(e:Event)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_buttonShot.enabled&nbsp;=&nbsp;false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;bmd:BitmapData&nbsp;=&nbsp;new&nbsp;BitmapData(cam.width,&nbsp;cam.height);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bmd.draw(video);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;encoder:JPGEncoder&nbsp;=&nbsp;new&nbsp;JPGEncoder(95);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;bytes:ByteArray&nbsp;=&nbsp;encoder.encode(bmd);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;file:File&nbsp;=&nbsp;new&nbsp;File();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;now:Date&nbsp;=&nbsp;new&nbsp;Date();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file.nativePath&nbsp;=&nbsp;File.applicationDirectory.nativePath&nbsp;+&nbsp;File.separator&nbsp;+&nbsp;now.time&nbsp;+&nbsp;".jpg";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;fs:FileStream&nbsp;=&nbsp;new&nbsp;FileStream();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fs.open(file,&nbsp;FileMode.UPDATE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fs.writeBytes(bytes,&nbsp;0,&nbsp;bytes.length);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fs.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trace("saved!&nbsp;=&amp;amp;gt;&nbsp;"&nbsp;+&nbsp;file.nativePath);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch&nbsp;(e:Error)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trace(e.message);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_buttonShot.enabled&nbsp;=&nbsp;true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;window_onClose(e:Event)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stage.nativeWindow.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;window_onMove(e:Event)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stage.nativeWindow.startMove();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;trace(message:String)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_textAreaLog.text&nbsp;=&nbsp;message&nbsp;+&nbsp;"¥n"&nbsp;+&nbsp;_textAreaLog.text;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</pre>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/1479/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AS3 &#8211; BitmapMirror.asでYouTubeを鏡写しにする</title>
		<link>http://shokai.org/blog/archives/1433</link>
		<comments>http://shokai.org/blog/archives/1433#comments</comments>
		<pubDate>Sun, 30 Sep 2007 11:49:11 +0000</pubDate>
		<dc:creator>moblog</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[flv]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[YouTube]]></category>
		<category><![CDATA[画像処理]]></category>

		<guid isPermaLink="false">http://shlog.sakura.ne.jp/blog/?p=1433</guid>
		<description><![CDATA[右下の「Load」を押して再生。 → Source Code (Flash CS3 / AS3) 土善開発合宿(ゆーすけべー日記: 奥出研&#8217;07秋合宿@土善旅館に部外者(OB)の開発合宿も兼ねて参入してきた) [...]]]></description>
			<content:encoded><![CDATA[<p>
<p>右下の「Load」を押して再生。</p>
<p><object width="640" height="278"><param name="movie" value="http://shokai.org/archive/as3/0709_dozen/KagamiVideo/Kagami.swf"></param><embed src="http://shokai.org/archive/as3/0709_dozen/KagamiVideo/Kagami.swf" type="application/x-shockwave-flash" width="640" height="278"></embed></object></p>
<p>→ <a href="http://shokai.org/archive/as3/0709_dozen/KagamiVideo/">Source Code (Flash CS3 / AS3)</a></p>
<p>土善開発合宿(<a href="http://yusukebe.com/archives/07/09/23/152051.html">ゆーすけべー日記: 奥出研&#8217;07秋合宿@土善旅館に部外者(OB)の開発合宿も兼ねて参入してきた</a>)で作ってた<a href="http://shokai.org/archive/as3/0709_dozen/KagamiVideo/BitmapMirror.as">BitmapMirror.as</a>を公開しておきます。</p>
<p>宴会直前に到着したのであんまり時間がなかったけど、今回やったことは3つ<br /><br />
１．YouTubeのビデオ(flv)をGoogleVideo経由で取得して<br /><br />
２．AS3のBitmapDataとして扱って<br /><br />
３．鏡面反射させる</p>
<p>ビデオはこれを読み込んでいます。ひゃあ゛ああああうまい゛いいいいい<br /><br />
<object width="425" height="353"><param name="movie" value="http://www.youtube.com/v/YRY0M5cgDG8&#038;rel=1"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/YRY0M5cgDG8&#038;rel=1" type="application/x-shockwave-flash" wmode="transparent" width="425" height="353"></embed></object></p>
<p>■１．YouTubeのビデオをGoogleVideo経由で取得する<br /><br />
数ヶ月前にGoogleに買収されて以来、<br /><br />
http://www.youtube.com/watch?v=YRY0M5cgDG8<br /><br />
のビデオは<br /><br />
http://cache.googlevideo.com/get_video?video_id=YRY0M5cgDG8<br /><br />
から取れる様になりました。<br /><br />
以前は<a href="http://search.cpan.org/~yoshida/WebService-YouTube/lib/WebService/YouTube.pm">WebService::YouTube</a>を<a href="http://web.sfc.keio.ac.jp/~shokai/archives/2006/12/tagtube.html">使って<br /><br />
</a>スクレイピングしなければならなかったけど、素直になった。</p>
<p><span id="more-1433"></span><br /><br />
■２．flvからBitmapDataオブジェクトを作る<br /><br />
Flash Player9から、flvファイルや画像を外部から読み込んでBitmapDataオブジェクトを作るとクロスドメイン警告が出る様になった。<br /><br />
適切なcrossdomain.xmlが置いてあるサイトなら（例えばfarm1.static.flickr.comなど）<br /><br />
fl.Loader系でloadする時に</p>
</p>
<blockquote><p><p>uiLoader.load(new URLRequest(textUrl.text), new LoaderContext(true,null, null));</p></p></blockquote>
<p>
<p>などして、<a href="http://livedocs.adobe.com/flex/2_jp/langref/flash/system/LoaderContext.html">LoaderContext</a>オブジェクトを渡してやれば<br /><br />
crossdomain.xmlを読んでくれるんだが<br /><br />
なんとかする方法を見つけた。</p>
<p>BitmapData.draw()メソッドでビットマップデータオブジェクトを外部のドメインのデータから作ろうとするとした時に警告が出る、ということは、<br /><br />
draw()する瞬間だけ外部ドメインじゃなければいい。</p>
<p>こうする。</p>
</p>
<blockquote><p><p>video.attachNetStream(null);<br /><br />
bmd.draw(video);//ビットマップデータを取得<br /><br />
video.attachNetStream(stream);</p></p></blockquote>
<p>
<p>ビットマップ取る時だけnullをattachしても、videoの表示は消えない（一瞬止<br /><br />
まる）だけなので目には見えない。</p>
<p>ここまで情報元：<a href="http://saqoosha.net/2007/07/22/609/">[Saq.] YouTube の FLV を抜き出すのが簡単になっている件</a></p>
<p>■３．<a href="http://shokai.org/archive/as3/0709_dozen/KagamiVideo/BitmapMirror.as">BitmapMirror.as</a>で鏡面反射させる<br /><br />
使い方。<br /><br />
コンストラクタでBitmapDataを渡してあげて、process()する。getBitmapData()で処理後のBitmapDataを取得できるので結果表示用のBitmapに渡してやれば表示できる。<br /><br />
thresholdプロパティで左端から鏡までの距離を指定できる。</p>
<p>myBitmapData:BitmapDataがカメラやストリームやMovieCilpなり何なりから作ってあるとして、</p>
</p>
<blockquote><p><p>var mirror:BitmapMirror = new BitmapMirror(myBitmapData);</p>
<p>// 鏡処理(左右反転)したbitmapdataを受け取る<br /><br />
mirror.getBitmapData();</p>
<p>// 反転処理を反映させる<br /><br />
mirror.process();</p></p></blockquote>
<p>
<p>普通にあらかじめ</p>
</p>
<blockquote><p><p>var bmp_result:Bitmap = new Bitmap(mirror.getBitmapData());<br /><br />
this.addChild(bmp_result);</p></p></blockquote>
<p>
<p>しておけば、毎フレーム毎に mirror.process(); すれば更新されます。</p>
<p>thresholdプロパティは、「左端から何ピクセル目に鏡をあてているか」です。<br /><br />
mirror.threshold = 30だと30ピクセル目になる。<br /><br />
今回はスライダーに合わせてるので、ソースが横幅320pixelだから</p>
</p>
<blockquote><p><p>slider.maximum = 320;<br /><br />
mirror.threshold = slider.value;<br /><br />
mirror.process();</p></p></blockquote>
<p>
<p>ってやってる。</p>
<p><a href="http://shokai.org/archive/as3/0709_dozen/KagamiVideo/Kagami.fla">Kagami.fla</a> 1frame目（<a href="http://shokai.org/archive/as3/0709_dozen/KagamiVideo/BitmapMirror.as">BitmapMirror.as</a>を同じディレクトリに入れてやる必要あり）<br /><br />
</p>
<blockquote><p>importfl.events.*;</p>
<p>//入力用<br /><br />
varvideo:Video=newVideo(320,240);<br /><br />
varconn:NetConnection=newNetConnection();<br /><br />
conn.connect(null);<br /><br />
varstream:NetStream=newNetStream(conn);<br /><br />
stream.client={onMetaData:function():void{}};</p>
<p>varbmd:BitmapData=newBitmapData(320,240);</p>
<p>//ミラー<br /><br />
varmirror:BitmapMirror=newBitmapMirror(bmd);<br /><br />
varbmp_result:Bitmap=newBitmap(mirror.getBitmapData());</p>
<p>//結果表示用<br /><br />
bmp_result.x=0;<br /><br />
bmp_result.width=640;<br /><br />
bmp_result.height=240;<br /><br />
this.addChild(bmp_result);</p>
<p>varplayFlug:Boolean=false;</p>
<p>buttonLoad.addEventListener(MouseEvent.CLICK,loadVideo);<br /><br />
functionloadVideo(e:Event){<br /><br />
trace(&#8220;loadVideo()&#8221;);<br /><br />
stream.play(textUrl.text);<br /><br />
playFlug=true;<br /><br />
}</p>
<p>this.addEventListener(Event.ENTER_FRAME,reloadMirror);<br /><br />
slider.addEventListener(SliderEvent.THUMB_DRAG,reloadMirror);</p>
<p>functionreloadMirror(e:Event){<br /><br />
if(!playFlug)return;<br /><br />
<br /><br />
video.attachNetStream(null);<br /><br />
bmd.draw(video);//ビットマップデータを取得<br /><br />
video.attachNetStream(stream);<br /><br />
mirror.threshold=slider.value;<br /><br />
mirror.process();//鏡写しのビットマップデータ作成<br /><br />
}<br />
</p></p></blockquote>
<p>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/1433/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flash CS3 &#8211; 背景差分法</title>
		<link>http://shokai.org/blog/archives/1416</link>
		<comments>http://shokai.org/blog/archives/1416#comments</comments>
		<pubDate>Mon, 03 Sep 2007 20:39:47 +0000</pubDate>
		<dc:creator>moblog</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[webcam]]></category>
		<category><![CDATA[画像処理]]></category>
		<category><![CDATA[背景差分法]]></category>

		<guid isPermaLink="false">http://shlog.sakura.ne.jp/blog/?p=1416</guid>
		<description><![CDATA[昨日Flash CS3を買ったので、さっそくAS3でやってみた。 自分で1からBitmapDataクラスを使うのは初めてだったけどprocessingやってたお陰ですぐわかった。 一旦カメラの前からどいて、Save Ba [...]]]></description>
			<content:encoded><![CDATA[<p>
<p>昨日Flash CS3を買ったので、さっそくAS3でやってみた。</p>
<p>自分で1からBitmapDataクラスを使うのは初めてだったけどprocessingやってたお陰ですぐわかった。</p>
<p>一旦カメラの前からどいて、Save Backgroundボタンを押してみてください<br /><br />
<object width="800" height="350"><param name="movie" value="http://shokai.org/archive/as3/070903_camera/backgroundSubtraction.swf"></param><param name="allowScriptAccess" value="sameDomain" /><embed src="http://shokai.org/archive/as3/070903_camera/backgroundSubtraction.swf" type="application/x-shockwave-flash" width="800" height="350"></embed></object></p>
<p>うまくいくとこうなってるはず<br /><br />
<a href="http://www.flickr.com/photos/shokai/1315180460/" title="Photo Sharing"><img src="http://farm2.static.flickr.com/1320/1315180460_d09e5e08be.jpg" width="500" height="246" alt="BackgroundSubtraction" /></a></p>
<p>■<a href="http://shokai.org/archive/as3/070903_camera/backgroundSubtraction.fla">SourceCode (Flash CS3 / AS3)</a></p>
<p><span id="more-1416"></span><br /><br />
1フレーム目。左の大きなビデオ(camDebug)とは別に、画面に表示していない200&#215;150の小さなVideoオブジェクト(camVideo)がある。そこからBitmapDataを作って、背景差分法で処理する。処理した結果を画面右のBitmapオブジェクトに表示して、ついでにぼかしフィルタ(blur)をかけた。<br /><br />
背景差分法は、単純に1度保存しておいたBitmapData(bgBmd)と現在の表示(nowBmd)を1ピクセルずつ比較して、差がある所だけ黒くしている。<a href="http://web.sfc.keio.ac.jp/~shokai/archives/2007/04/proce55ing-bg-sub.html">大体Processingの時</a>と同じ。</p>
</p>
<blockquote><p><p>varthreshold:int=30;//影化のしきい値<br /><br />
labelThreshold.text=&#8221;threshold:&#8221;+threshold.toString();</p>
<p>varcam:Camera=Camera.getCamera();<br /><br />
cam.setMode(640,480,24,true);//24fps<br /><br />
cam.setQuality(0,100);</p>
<p>varcamVideo:Video=newVideo(200,150);//bitmap計算用<br /><br />
camVideo.attachCamera(cam);<br /><br />
camDebug.attachCamera(cam);//デバッグ用の表示</p>
<p>varbgBmd:BitmapData=newBitmapData(camVideo.width,camVideo.height);<br /><br />
varnowBmd:BitmapData=newBitmapData(camVideo.width,camVideo.height);<br /><br />
varshadowBmd:BitmapData=newBitmapData(camVideo.width,camVideo.height);</p>
<p>//結果表示用<br /><br />
varshadowBmp:Bitmap=newBitmap(shadowBmd);//bmdを操作すると逐次bmpに反映される<br /><br />
shadowBmp.x=400;<br /><br />
shadowBmp.width=400;<br /><br />
shadowBmp.height=300;<br /><br />
this.addChild(shadowBmp);</p>
<p>varblur:BlurFilter=newBlurFilter();//ぼかしフィルタ<br /><br />
blur.blurX=5;<br /><br />
blur.blurY=5;<br /><br />
blur.quality=BitmapFilterQuality.MEDIUM;<br /><br />
shadowBmp.filters=[blur];</p>
<p>buttonSaveBg.addEventListener(MouseEvent.CLICK,saveBg);<br /><br />
functionsaveBg(e:Event){<br /><br />
trace(&#8220;saveBg()&#8221;);<br /><br />
bgBmd.draw(camVideo);//背景再取得<br /><br />
}</p>
<p>functioncomparePixels(a:int,b:int,threshold:int):Boolean{<br /><br />
vara_red:int=a>>16&0xFF;<br /><br />
varb_red:int=b>>16&0xFF;<br /><br />
vara_green:int=a>>8&0xFF;<br /><br />
varb_green:int=b>>8&0xFF;<br /><br />
vara_blue:int=a&0xFF;<br /><br />
varb_blue:int=b&0xFF;<br /><br />
if((a_red>b_red&#038;&#038;a_red-b_red>threshold)||(a_red<b_red&#038;&#038;b_red-a_red>threshold)||<br /><br />
(a_green>b_green&#038;&#038;a_green-b_green>threshold)||(a_green<b_green&#038;&#038;b_green-a_green>threshold)||<br /><br />
(a_blue>b_blue&#038;&#038;a_blue-b_blue>threshold)||(a_blue<b_blue&#038;&#038;b_blue-a_blue>threshold)<br /><br />
)returntrue;//色に差がある時<br /><br />
elsereturnfalse;//色に差が無い時<br /><br />
}</p>
<p>this.addEventListener(Event.ENTER_FRAME,reload);//毎フレーム実行イベント<br /><br />
functionreload(e:Event){<br /><br />
//背景差分法で変化のあったピクセルを検出、黒く塗りつぶす<br /><br />
nowBmd.draw(camVideo);<br /><br />
shadowBmd.lock();//bitmap操作中は表示に反映させない<br /><br />
for(vary:int=0;y<bgBmd.height;y++){<br /><br />
for(varx:int=0;x<bgBmd.width;x++){<br /><br />
if(comparePixels(bgBmd.getPixel(x,y),nowBmd.getPixel(x,y),threshold)){<br /><br />
shadowBmd.setPixel(x,y,0xFF000000);<br /><br />
}<br /><br />
else{<br /><br />
shadowBmd.setPixel(x,y,0xFFFFFF90);<br /><br />
}<br /><br />
}<br /><br />
}<br /><br />
shadowBmd.unlock();<br /><br />
}</p>
<p>buttonInc.addEventListener(MouseEvent.CLICK,<br /><br />
function(){<br /><br />
if(threshold<128)labelThreshold.text="threshold:"+(++threshold).toString();<br /><br />
});<br /><br />
buttonDec.addEventListener(MouseEvent.CLICK,<br /><br />
function(){<br /><br />
if(threshold>0)labelThreshold.text=&#8221;threshold:&#8221;+(&#8211;threshold).toString();<br /><br />
});</p></p></blockquote>
<p>
<p>あとMath.abs()の動作がおかしくて、comparePixels()の所で使えなかったので長いif文になってしまった。</p>
<p>■参考<br /><br />
・<a href="http://un-q.net/2007/08/actionscript30_01.html">ActionScript3.0で動体検知 01 (Unknown Quality)</a><br /><br />
・<a href="http://d.hatena.ne.jp/flashrod/20061015">flashrod &#8211; AS3で画像処理入門(1)</a><br /><br />
・<a href="http://d.hatena.ne.jp/flashrod/20061117">flashrod &#8211; 2006-11-17</a><br /><br />
・<a href="http://web.sfc.keio.ac.jp/~shokai/archives/2007/04/proce55ing-bg-sub.html">s.h.log: Proce55ingで背景差分法</a></p>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/1416/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

