ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
フォーラム一覧   -   トピック一覧
   ActionScript 3.0
     mx.utils.Base64Encoder/Base64Decoderって知ってました?
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 トピック
nobu
投稿日時: 2007-4-6 16:13
ご主人様
登録日: 2006-6-17
居住地:
投稿: 593
mx.utils.Base64Encoder/Base64Decoderって知ってました?
のぶです。
気がついたので報告&質問です。

報告は題名の通りで、mx.utilsにBase64Encoder/Base64Decoderなる
クラスを発見しました。このクラス、SDKの中にソースがないわ、
ヘルプにはそんなこと一言も書いてないわ(英語/日本語共に)という
代物です。

興味本位で使ってみました。
以前、「イメージを Clipboard したい。」のトピでBase64エンコー
ドデコードを行うクラスがDynamic Flashというサイトで紹介されて
いることがわかりましたので、双方で試してみました。結果は、同
じものを得る事が出来ました。

■Dynamic Flash "Base64"
http://dynamicflash.com/goodies/base64

以下、サンプルです。Dynamic Flashのサンプルを多少アレンジ。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

	<mx:Script>
		<![CDATA[
			import com.hoge.Base64;
			import mx.utils.Base64Encoder
			import mx.utils.Base64Decoder;

			private function BtnOnClick(e:MouseEvent):void
			{
				/**
				 * 共通使用
				 */
				var obj:Object= {name:"nobu@FxUG",url:"http://fxug.net"};

				/**
				 * Base64クラスでのエンコード/デコード
				 */
				var source:ByteArray = new ByteArray();
				source.writeObject(obj);

				// エンコード
				var encoded:String = Base64.encodeByteArray(source);
				trace("Base64 -> " + encoded);

				// デコード
				var decoded:ByteArray = Base64.decodeToByteArray(encoded);
				obj = decoded.readObject();
				trace("Base64 -> " + obj.name + "(" + obj.url + ")");
				
				

				/**
				 * Base64Encode/Decodeクラスでのエンコード/デコード
				 */
				var encStr:String;
				var decObj:Object;
				var src:ByteArray = new ByteArray();
				src.writeObject(obj);

				// エンコード
				var enc:Base64Encoder = new Base64Encoder();
				enc.encodeBytes(src);
				encStr = enc.flush();
				trace("Base64Encode/Decode -> " + encStr);
				
				// デコード
				var dec:Base64Decoder = new Base64Decoder();
				dec.decode(encStr);
				decObj = dec.flush().readObject();
				trace("Base64Encode/Decode -> " + obj.name + "(" + obj.url + ")");

			}
		]]>
	</mx:Script>

	<mx:Button x="72" y="67" label="押して♪" width="531" height="391" click="BtnOnClick(event)"/>
	
	
	
</mx:Application>


知ってる方いました?



ここから質問です。(前振り長くてすみません)
imageコンポで source="hoge.png" とすると画面にhoge.pngを表示
する事はできますが、一度imageコンポにロードされた画像情報のみ
を得る方法はありますでしょうか?
※上記例の場合は、hoge.png自体のデータです。ByteArrayとかで
取得できたらと思っています。

またその逆で、ByteArrayに格納されている画像情報をImageに入れ
て表示させる方法はありますでしょうか?
これは、先程のエンコード・デコードも関係してくるのですが、
エンコードされている画像データ(文字列)が与えられ、それを
画面のImageコンポ上に表示したいと思っています。

何かご存知の方、よろしくお願い致します。

<追記>
■環境
Eclipse3.2.2
Flex Builder 2.0.1 日本語版
venzou
投稿日時: 2007-4-6 17:27
ご主人様
登録日: 2007-1-25
居住地: 穴の中
投稿: 101
Re: mx.utils.Base64Encoder/Base64Decoderって知ってました?
こんちには。

>Base64Encoder/Base64Decoder

知りませんでした。隠しコマンドですね。
他にもあるのかな、探してみると楽しいかも。
(と言っても、どうやって探したら良いのか分からないけど・・(^^;)


引用:
imageコンポで source="hoge.png" とすると画面にhoge.pngを表示
する事はできますが、一度imageコンポにロードされた画像情報のみ
を得る方法はありますでしょうか?

直接ファイルからByteArrayに読み込むなら、URLLoaderで可能です。
これではダメなのかな?


引用:
またその逆で、ByteArrayに格納されている画像情報をImageに入れ
て表示させる方法はありますでしょうか?

これは、経験があります。Loader.loadBytes()で可能です。
PNG、GIF、JPEG、SWFファイルを自動認識で読み込んでくれるようです。


サンプル
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" >
    <mx:Script>
        <![CDATA[
            private const ImgFile:String = "hoge.png";

            import mx.utils.Base64Encoder
            import mx.utils.Base64Decoder;

            private function ImageLoad():void
            {
                var urlldr:URLLoader = new URLLoader();
                urlldr.addEventListener(Event.COMPLETE, ImageLoaded);
                urlldr.dataFormat = URLLoaderDataFormat.BINARY;
                urlldr.load(new URLRequest(ImgFile));
            }
            
            private function ImageLoaded(e:Event):void {
                // エンコード
                var enc:Base64Encoder = new Base64Encoder();
                enc.encodeBytes(ByteArray(URLLoader(e.target).data));
                encodeText.text = enc.flush();
            }
            
            private function ImageDecode():void {
                var ldr:Loader = new Loader();
                // デコード
                var dec:Base64Decoder = new Base64Decoder();
                dec.decode(encodeText.text);
                ldr.loadBytes(ByteArray(dec.flush()));
                decodeImage.addChild(ldr);
            }
        ]]>
    </mx:Script>
    <mx:VBox width="100%" height="100%">
        <mx:Button label="画像ファイルを読み込んでエンコード" click="ImageLoad()" />
        <mx:TextArea id="encodeText" width="100%"  height="100%" />
        <mx:Button label="デコードして画像に" click="ImageDecode()" />
        <mx:Image id="decodeImage" width="100%"  height="100%" />
    </mx:VBox>
</mx:Application>

nobu
投稿日時: 2007-4-6 22:33
ご主人様
登録日: 2006-6-17
居住地:
投稿: 593
Re: mx.utils.Base64Encoder/Base64Decoderって知ってました?
>venzouさん

引用:

直接ファイルからByteArrayに読み込むなら、URLLoaderで可能です。
これではダメなのかな?


ありです!URLLoader。使ったことなかったです^-^;;;;

引用:

これは、経験があります。Loader.loadBytes()で可能です。
PNG、GIF、JPEG、SWFファイルを自動認識で読み込んでくれるようです。


これもありです!サンプルまでありがとうございます。サンプルの
動作確認できました。参考にします。


URLLoaderもLoaderも使ったことなかったです。今まで画像と言えば
imageでロード、swfはSWFLoaderでした。そのせいか、URLLoaderと
Loaderがちょっとモヤっとという感じです。
凄く漠然としたイメージとしては、URLLoaderで指定のURLからファイ
ル情報を取得し、DisplayObjectを継承しているLoaderに入れること
で他クラスが利用できるオブジェクトとして利用できている・・・って
いう感じなのでしょうか?

venzou
投稿日時: 2007-4-8 17:17
ご主人様
登録日: 2007-1-25
居住地: 穴の中
投稿: 101
Re: mx.utils.Base64Encoder/Base64Decoderって知ってました?
引用:
凄く漠然としたイメージとしては、URLLoaderで指定のURLからファイ
ル情報を取得し、DisplayObjectを継承しているLoaderに入れること
で他クラスが利用できるオブジェクトとして利用できている・・・って
いう感じなのでしょうか?

詳しい事については私も分かりませんが・・・

URLLoaderは単にファイルを読み込むだけです。ファイル形式は関係なく、どんなファイルでも読み込めまます。例えばPNGファイルを読み込んだ場合、PNG形式で圧縮されている状態のまま、ByteArrayに読み込みます。しかし、圧縮されたままでは画像として扱えません。

一方LoaderはファイルやByteArrayからデータを読み込み、ファイル形式を識別し、内容を画像などに変換します。対応しているファイル形式はPNG、JPEG、GIF、SWF形式に限られます。例えばPNG形式のデータを読み込んだ場合、圧縮されているデータを伸張し、画像に変換して、自分自身の子に追加します。

調べてみた所、PNG、JPEG、GIFファイルはBitmapに変換されるようです。
SWFファイルは、リファレンスガイドに説明がありました。
・ActionScript 1.0 または 2.0 で作成された SWF ファイル (AVM1Movie オブジェクトとしてロードされる)
・ActionScript 3.0 で作成された SWF ファイル (Sprite または MovieClip オブジェクトとしてロードされる)

まとめると、

・URLLoaderはどんなファイルでも読み込めるが、そのままでは利用できない。
・Loaderはファイル形式は限定されるが、利用できる形に変換してくれる。

という、感じでしょうか。
nobu
投稿日時: 2007-4-9 10:58
ご主人様
登録日: 2006-6-17
居住地:
投稿: 593
Re: mx.utils.Base64Encoder/Base64Decoderって知ってました?
>venzouさん

引用:

URLLoaderは単にファイルを読み込むだけです。ファイル形式は関係なく、どんなファイルでも読み込めまます。
  ・
一方LoaderはファイルやByteArrayからデータを読み込み、ファイル形式を識別し、内容を画像などに変換します。対応しているファイル形式はPNG、JPEG、GIF、SWF形式に限られます。例えばPNG形式のデータを読み込んだ場合、圧縮されているデータを伸張し、画像に変換して、自分自身の子に追加します。

調べてみた所、PNG、JPEG、GIFファイルはBitmapに変換されるようです。
  ・

・URLLoaderはどんなファイルでも読み込めるが、そのままでは利用できない。
・Loaderはファイル形式は限定されるが、利用できる形に変換してくれる。


私のイメージと合っているようです。理解できました。
丁寧な説明ありがとうございます。

以外なのは、「PNG、JPEG、GIFファイルはBitmapに変換」です。
Loaderのパッケージが"flash.display"なので、てっきりMovieClip
に変換されるものだと思っていました。

何とか目的は果たせそうです。ありがとうございました。
ring
投稿日時: 2007-12-10 22:19
常連さん
登録日: 2007-1-31
居住地:
投稿: 36
Re: mx.utils.Base64Encoder/Base64Decoderって知ってました?
ずいぶん昔の記事にレスですが・・

FlexBuilder3beta2ではいつの間にかこのクラスが見当たらなくなってしまいました(私の環境だけかもしれませんが)。
何かご存知の方いましたら教えてください。

#同様の処理をするクラスを自作するしかないですかね・・。
nobu
投稿日時: 2007-12-11 0:19
ご主人様
登録日: 2006-6-17
居住地:
投稿: 593
Re: mx.utils.Base64Encoder/Base64Decoderって知ってました?
>ringさん

トピあげた張本人です。
どうやらsdkの中にソースはあるようです。

※Windows Plug-in版で確認
\Program Files\Adobe\Flex Builder 3 Plug-in\sdks\3.0.0\frameworks\projects\framework\src\mx\utils

Builderの入力保管機能ではでてきませんね。

念のためソースをみてみると、こんなメタタグが。

[ExcludeClass]

このタグについては、過去ログでヒットするトピがありました。

http://www.fxug.net/modules/xhnewbb/viewtopic.php?viewmode=thread&topic_id=612&forum=2&post_id=2260#2260

おそらく非公式なものの為か、利用できないようにされているんだ
と思います。


「Base64Encoder/Decoderクラスが使えなくなった」と、しら〜っと
"バグ"として報告したらどんなリアクションが返ってくるんでしょ
うね(滝汗)
ring
投稿日時: 2007-12-11 10:21
常連さん
登録日: 2007-1-31
居住地:
投稿: 36
Re: mx.utils.Base64Encoder/Base64Decoderって知ってました?
>nobuさん

おお、無くなったわけではないんですね。
普通にBuilderの補完機能で見えないだけで、importしたら使えるようになりました。

今までこんなフォルダ見たことがなかったのですが、ソース見るといろいろ勉強になりそうです。
時間を見つけて眺めてみようかと思います。。

ありがとうございました!
nobu
投稿日時: 2007-12-13 16:12
ご主人様
登録日: 2006-6-17
居住地:
投稿: 593
Re: mx.utils.Base64Encoder/Base64Decoderって知ってました?
Flex3 beta3でmx.utils.Base64Encoder/Base64Decoderが復活して
ます!!!


beta2で隠されていた理由って一体・・・???
ring
投稿日時: 2007-12-14 22:34
常連さん
登録日: 2007-1-31
居住地:
投稿: 36
Re: mx.utils.Base64Encoder/Base64Decoderって知ってました?
おお、ほんとですね!

さっそく今まで作ったソースをbeta3用に入れなおしてみたところ、Base64は使えるようになったのですが今度はAIRでHTMLを読み込んで使っていたhtmlControlメソッドが使えなくなっていました・・。

しばらく調べてみてダメそうならまた質問させていただきます^^;

やはり環境のアップデートは慎重にやるべきですね。。orz
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を