[astro filereference] astroでのFileReference

LINEで送る
Pocket

いやーすごいですね!astro!

ローカルへのファイル保存が可能だなんて!

実際は、FileReferenceはローカルファイルを読み込んで直接操作できるみたいですが、ひとまず今回は保存です。

 

サンプルはこちら。

(Flashサンプル。赤丸をクリックすると、保存ダイアログが現れて、適当な名前を入力してボタンを押すと、保存。)

注意点としては、同じファイル名で上書き保存しようとすると例外をはくらしいです。

(これはもしかすると僕のサンプルが悪いだけかもです。。)

corelibのJPGEncoderを使って、stageを画像として保存しています。

ようは、FileReferenceにsaveというメソッドができて、それを使うと保存できるよ、ということです。

ちなみに、保存できる形式は、

String, XML, ByteArrayらしいです。

今回のサンプルは、ByteArrayを使って保存しています。

 

ちなみにソースはこんなのです。

 

package
{
import com.adobe.images.*;
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.utils.ByteArray;
public class main extends MovieClip
{
private var jpg:JPGEncoder = new JPGEncoder(100);
private var container:Sprite;
private var bmpdata:BitmapData;
private var btn:Sprite;
private var fr:FileReference;
public function main()
{
init();
}

private function init():void
{
//保存ダイアログを出すためのボタン。
btn = new Sprite();
btn.graphics.beginFill(0xff0000, 1);
btn.graphics.drawCircle( 0, 0, 10);
btn.graphics.endFill();
addChild(btn);
btn.width = btn.height = 10;
btn.x = btn.y = 320;
btn.addEventListener(MouseEvent.CLICK, onSave);
fr = new FileReference();
}
private function onSave(e:MouseEvent):void
{
bmpdata = new BitmapData(400, 400, true);
bmpdata.draw(stage);
var ba:ByteArray = new ByteArray();
// stageをBitmap化したものを、ByteArrayに変換。
ba = jpg.encode(bmpdata);
// 保存ダイアログを出す。
fr.save(ba, “astroSavedFile.jpg”);
}
}
}
いや、ほんとにastroはDynamic Sound Generationといい、すごい進化してますね。

 

splashup

LINEで送る
Pocket

これってオンライン版Photoshopみたいなものでしょうか??
これはFlexで作ってますよね?

splashup
http://www.splashup.com/

早速やってみました。

・Webcamからも画像を作れるし、ローカルの画像はもちろん、splashupやfacebook、flickr、picasaや指定したURLからも画像を取得可能らしい。
・レイヤー構造もあるし、当然不透明度も重ねモードも設定可能。
・ってかアイコンがPsと似すぎてない?大丈夫?

・filterをいじってたらエラーダイアログが出ちゃいました。。。これってなんとかならんかなあ。。。(playerの方で)

2007年12月9日21:52

ちょい絶での発言を訂正

LINEで送る
Pocket

2007年11月30日@アップルップル会議室にて行われたちょい絶発表会ですが、
その時、僕が不適切な発言をしてしまったため、訂正します。

訂正したい発言:『Tweenerって曲線のトゥイーンできないでしょ?』

正解:『Tweenerって曲線のトゥイーンまでできてしまう!!』

やり方:
_bezier:{ x: 0, y: 300}とか書けばOK!

サンプル
package{

import caurina.transitions.*;
import flash.display.*;
import flash.events.*;

public class TweenerBezier extends Sprite{

private var ball:Sprite;

public function TweenerBezier(){
init();
}

private function init():void{

initBall();
//addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}

private function initBall():void{

ball = new Sprite();
ball.graphics.beginFill( 0xff0000, 1);
ball.graphics.drawCircle( 0, 0, 50);
ball.graphics.endFill();

addChild(ball);
ball.x = ball.y = 0;

Tweener.addTween( ball, { x: 600, y: 0, _bezier:{ x:200, y:450}, time: 2, transition: “easeOutQuad”});

}

}
}

ごめんなさい。

そして、最高にすばらしいサンプルはこちらを。
http://labs.zeh.com.br/blog/?p=104

2007年12月3日01:31

PV3Dいじってみました。

LINEで送る
Pocket

PV3Dをいじってみようと思い、ちょっと作ってみました。
http://www.hi-farm.net/weblog_enter.html

詳しくはリンク先に書いていますが、
・このブログからデータを引っ張ってきてます。
・Planeオブジェクトにロールオーバーすると、音がなりますのでご注意下さい。
 定期的になる音は、panやボリュームをいじってます。

まあ、音offとかはないのですが、あくまでPV3Dの習作ということで。

2007年11月18日23:51

今更すぎるのですが。

LINEで送る
Pocket

Papervision3Dと、Tweenerデビューしました。

AS2で書いている時は、ずーっと一人で書いていて、同業者の知り合いも少なかったため、既存のフレームワークとかライブラリを使うのが不安でした。

以前、取引先の会社と仕事をしていて(その時は別の言語です)、その会社独自のフレームワークに準拠して開発するように言われていて、その通りにしていたのですが、
標準の関数使えばすぐにできるのに、フレームワークを使ってどうやればいいか全くわからず、時間だけかかってしまい、
その時にむやみにフレームワークに依存しすぎると却って効率が飛躍的に低下したり、また、人が殆どの仕組みを作ってくれているがゆえに、頼りすぎると、問題があったときに自力で解決できなくなるのではないか、と不安になったのもフレームワークから遠ざかっていた理由です。

自分の立ち位置の捉え方次第で考え方は変わるとは思うのですが、今までは上記のような考えがあり、使うのをためらってました。

そんな自分が最近になり、多くのFlasherさんと知り合う機会ができて、フレームワークを有効利用している人がおおいな、ということに気づかされました。さらに、それだけ使われているのなら、信頼性も高いんだろうな、と感じで始めようかな、という様に考えが変化していきました。

で、取り入れたのは、CASAではなく(まだAS3版はないですよね?)、Papervision3D、Tweener。
フレームワークっていうよりは、ライブラリと言った方が正しいのでしょうか。

Tweenerのあまりのシンプルな使い方や、Papervision3Dで書いてみて、「こんなにすぐに作れるんだ」というのに感激してしまい、導入に踏み切りました。

ただ、今更なのと、サンプルやら解説を付けれるほどの状態ではないので、今は始めました。と宣言するにとどめておきます。

でも、一応3Dの原則とかは把握するようにしておきます。

2007年10月23日23:43

いろいろ行ってきました。

LINEで送る
Pocket

金曜、土曜と色々と勉強会へ行ってきました。

まず、金曜。
Takeshi MAX Japan 2007 @アップルストア心斎橋

19:00にアップルストアにつくも、人が少なめ。
僕は初めての発表だったので、人が少なめでほっとしていたのですが、イベントが始まり、エグゼクティブたけしの基調講演が行われ、素敵なTakeshi MAXグッズが発表され、進行して行くうちに、人が集まってきたようです。

で、初めての発表。内容はAIR事始め、ってことで、AIRの導入編という内容でした。

初め若干緊張しましたが、なんとかなって良かったです。

nitoyonさんに優しい言葉を頂き、これからも発表とかしたいな、と思いました。

そのnitoyonさんも飛び入りで発表。ほんとにnitoyonさんのプレゼンはすごいなー、おもろいし、とかんしんしてました。

飲み会もやっぱりおもろかったです。
仕事のはなしやらそうでない話しやら、すごく楽しかったです。

次回は11月下旬ころらしいです。日程があえば参加しそうです。

土曜日:
実家で一泊し、お昼には名古屋へ。
WCAN automnへ。
いつも参加しているWCAN mini asチームが発表するという事で、参加しました。

WCAN miniにはちょくちょく参加してたのですが、おっきい方は初めて。
運動会がすごく盛り上がってて、楽しかったです。

後は、miniと違ってASを使っていない人にどういう話し方をすれば上手く伝えられるんだろうか、ということを考えさせられました。

今回のWCANは2セッションで、もう一つは百式の人でした。
内容はもちろんなのですが、僕個人的には、内容の事より、プレゼンの仕方が上手いなー、ってことを見てました。

特に、前半で話していた内容をそのまま後半で実践しているところとか、「やるなぁこの人」とうなってました。

ただ、勉強会の段階でお酒が抜けてなくて、正直普段より上機嫌でした。。

そして懇親会。
いろんな人とあってご挨拶しつつ、ASチームの方や他の方ともお話しする。
AS mini mini会をやろう、と。 是非実現したいっす。

店をかえてもう一件のみに行く。

そこではASチームの人たちと熱く話す。
変態話は変態なのですが、文字通りの変態でした。

ただ、最高に楽しかったです。AIRベータ2だとか、Apolloとか。

やっぱりいろんな人とあっていろんな人と話すのは楽しいですね。
これからもいろんな人と知り合いたい、と思いました。

2007年10月21日01:11

Spark Projectのsnippetsに参加しました。

LINEで送る
Pocket

すみません。ここ最近色々とあり、記事を書けずにいました。

で、以前面白そうな事しているなー、と思い密かに関心をよせていた、
Spark project。
http://www.libspark.org/

何かで参加できないかなーと思っていたのですが、先日記事に書いた、文字コード検知ライブラリがあったので、早速参加させていただき、投稿いたしました。

Snippetsに、【mmlemon】として参加してます。
http://snippets.libspark.org/

良かったらのぞいてみて下さい。

今月は、Takeshi MAX Japan 2007
http://www.fxug.net/modules/bwiki/index.php?Flex2%CA%D9%B6%AF%B2%F1%C2%E825%B2%F3%A1%F7%C2%E7%BA%E5%BB%B2%B2%C3%BC%F5%C9%D5

翌日はWCAN
http://www.wcan.jp/
来月頭には
Adobe Max
と色々行事があって楽しみっす!

しばらく追いかけられてなかったMaxの情報も追いかけないと!
(ってMaxって文字が多いですね。。。)
ほんとにわくわくしますね。

後、今月来月と僕個人的には結構大きな分岐点が訪れると思っています。

2007年10月9日22:28

文字コード検知クラス 作ってみました。

LINEで送る
Pocket

Actionscript 3.0 の文字コード検知クラスを作成してみました。

ファイルはここにおいています。
http://www.hi-farm.net/aslib/detect.lzh

このクラスが何をするための物かと言えば、
文字コードを検知するものです。

ファイルをswfに取り込む時に、文字コードをutf-8に変換するものは、URLStreamのreadMultiByteメソッドがあるのですが、例えば、読み込むファイルの文字コードがランダムで指定できない場合、文字コードを検知するのが面倒でした。

そんな面倒なことはやりたくない!ということで、読み込もうとする文字コードの種類を検知するクラスを作成してみました。

簡単に言えば、
URLStreamを使ってファイルを読み込む場合:DetectOnWebクラス
FileStreamを使う場合:DetectOnAirクラス
を使って下さい。

言い直すと、
web上にあるファイルを調べる場合:DetectOnWebクラス
AIRを使ってローカルファイルを調べる場合:DetectOnAirクラス

ということです。

使い方は、
1 インポートする
2 インスタンス作成する
3 リスナー設定する
4 detectCharset(読み込むファイルのURL:String);
5 リスナーで答えを取得

という流れです。

例としてはこんな感じです。

DetectOnAirクラス:

<?xml version=”1.0″ encoding=”utf-8″?>
<mx:WindowedApplication xmlns:mx=”http://www.adobe.com/2006/mxml”; layout=”absolute” creationComplete=”initApp()”>
<mx:Script>
<![CDATA[

import net.hifarm.encode.DetectOnAir;

private var detect:DetectOnAir;

private function initApp():void{
detect = new DetectOnAir();
detect.addEventListener(“completeData”, comp);
//下のはローカルファイルのURL表現の例です。 detect.detectCharset(“file:///Users/mmlemon/Documents/Flex%20Builder%20Moxie/indexInPDF/shift-jis.txt”;);
}
private function comp(e:Event):void{
trace(detect.result);
}
]]>
</mx:Script>
</mx:WindowedApplication>

DetectOnWebクラス:
<?xml version=”1.0″ encoding=”utf-8″?>
<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml”; layout=”absolute” creationComplete=”initApp()”>
<mx:Script>
<![CDATA[

import net.hifarm.encode.DetectOnWeb;

private var detect:DetectOnWeb;

private function initApp():void{
detect = new DetectOnWeb();
detect.addEventListener(“completeData”, comp);
detect.detectCharset(“http://blog.hi-farm.net/”;);
}
private function comp(e:Event):void{
trace(detect.result);
}
]]>
</mx:Script>
</mx:Application>

すると、いずれも『detect.result』というところに結果が反映されます。具体的には、
“iso-2022-jp” , “euc-jp” , “utf-8″ , “shift-jis” , “iso-8859-2″

です。ちなみに、エラーが発生した場合、エラーメッセージがdetect.resultに返されます。
iso-8859-2は、iso-2022-jp、euc-jp、utf-8、shift-jisに当てはまらない結果が出た場合に示されます。

注意点:
現在は日本語しか判別できません。
韓国語や中国語の判定はできないのであしからず。

まだ作ったばかりで間もないため、不具合やエラーがあるかもしれません。
その場合、メールいただけると幸いです。

2007年9月26日01:08

Google AnalyticsのAIRアプリ

LINEで送る
Pocket

MXNAにて、こんなアプリ見つけました。

Analytics Reporting Suite
http://www.aboutnico.be/index.php/google-analytics-air-beta-sign-up/

Google Analyticsを使える状態にある事は、当然前提です。

Ajaxで見せているGoogleの画面も結構いいな、なんて思ってましたが、グラフを切り替えたときに、滑らかなアニメーションでそのグラフの変化を見せられたりして、相当使いやすかったです。
やっぱりAIRっていうか、swfってアプリケーションとしても使い勝手の良い物を作成できるんだ、とおもったのでした。

2007年9月25日15:04

ByteArrayで文字を取得してみよう。

LINEで送る
Pocket

今まであんまりソース書いてどうこう、というのをやってなかったので、今日はやってみます。

内容は基本的なことだと思うので、
「何をいまさらこんなこと書きやがって」ということを思う方もいるとは思いますが、そこは許して下さい。許して下さい。

テーマは、『ByteArrayを使ってバイナリで文字を判定しよう』ということです。

今回は、読み込もうとしているデータがflvファイルであるかどうかを判定するというものです。

仕様であるかをしっかり確認した訳ではないのですが、バイナリエディタでflvを開いてみると、画像
http://blog.hi-farm.net/images/flv.jpg
の様に、
頭に『FLV』と書いているのを発見しました。

なので、ファイルの先頭に『FLV』と書いていれば.flvファイルである、という判定方法です。
そして、別にflexプロジェクトでも別に良かったのですが、今回はAIRで作ってみました。

以下、ソースです。

<?xml version=”1.0″ encoding=”utf-8″?>
<mx:WindowedApplication xmlns:mx=”http://www.adobe.com/2006/mxml”; layout=”absolute” creationComplete=”initApp()”>
<mx:Script>
<![CDATA[

import flash.filesystem.File;
import flash.filesystem.FileMode;
import flash.filesystem.FileStream;

import flash.utils.ByteArray;

private var f:File;
private var fs:FileStream;
private var byteAry:ByteArray;

private function initApp():void{
var path:String = “/example.flv”; //取得したいパス
retreiveFileData(path);
}

private function retreiveFileData(path:String):void{

try{ //tryしておかないと、エラーが起きたときに止まってしまう
f = new File(path);
fs = new FileStream();
byteAry = new ByteArray();
fs.open(f, FileMode.READ);
fs.readBytes(byteAry, 0, fs.bytesAvailable); //全部頂く!(バイナリで)
var result:Boolean = retreiveFLV_Binary(byteAry);
if(result) result_ta.text = “This File is valid FLV file.”;
else result_ta.text = “This File is NOT valid FLV file.”;
}
catch(e:Error){
result_ta.text = e.message; //エラーメッセージを表示
}
finally{
fs.close(); //何が起きてもストリームを閉じます
}

}
private function retreiveFLV_Binary(ba:ByteArray):Boolean{
/*
ちなみに、FLVの仕様では、一番始めに、”FLV”という文字が入っているようです。
なので、FLVの文字が入っているかどうかを調べます。Byteで。
ちなみに、F L V のバイト表現は、
文字 : バイト表現
F : 46
L : 4C
V : 56
です。ファイルの頭にこのデータがあれば、FLVと見なします。
*/
//この辺はもっといい書き方があるはず。
var FLV_byte:Array = [parseInt(“0x46″,16),parseInt(“0x4C”,16),parseInt(“0x56″,16)]; //FLVのByte表現
var ba_ary:Array = [ba[0],ba[1],ba[2]]; //調べる対象のByteArrayをArrayに分けた配列

//判定結果を返す変数。 3行下に、『!=』 と書いている通り、resがfalseになる場合の判定を
//しているので、resのデフォルト値はtrue。
var res:Boolean = true;
for(var i:int = 0; i < 3; i++){
if(FLV_byte[i] != ba_ary[i]){ //データが違ってたらその場でループ終了
res = false;
break;
}
}
return res;
}
]]>
</mx:Script>
<mx:VBox>
<mx:Label text=”バイナリのFLVデータ” />
<mx:TextArea id=”result_ta” width=”300″ height=”300″ />
</mx:VBox>
</mx:WindowedApplication>

これをパブリッシュすると、
18行目のpathで指定されたファイルがflvの場合は、
“This File is valid FLV file.”

違う場合は、
“This File is NOT valid FLV file.”
と表示されます。

多分、「こんな書き方よりこの方が速い!きれい!」などあると思います。もしよろしければつっこんでやっていただけると大変うれしいです。

2007年9月15日02:15