こんにちは。きんくまです。
前回Amazonから画像を取得しようと試行錯誤したんですが、すごく簡単に解決しました。
クロスドメインポリシーについてよくわかっていなかったのが、原因です。
クロスドメインポリシーは、データの内部にアクセスするときにだけひっかかるようです。知らんかった、、。どういうことかというと、別ドメインから画像をひっぱってきたとき、以下のようになります。
●LoaderをそのままaddChildするだけ→おとがめなし
●Loader.contentにアクセスしようとしたとする→怒られる
だからひっぱってきたBitmapをdrawしたり、Bitmapの中のBitmapDataにアクセスしようとしてもだめです。
他のみなさん、どうやってひっぱってきていたのか不思議でしょうがなくて、こんな感じのことを考えてやろうとしていました。
サーバ側で、img画像を拾ってくる(バイナリ)→ASに渡す→ASで画像データをデコード→ASでaddChild。
そしたら、サーバーからASに渡すところまではたぶんできたようなんですが、AS側のデコードができんかったです。ASで、BitmapDataをpngやjpegにエンコードすることは、as3corelib でできますが、サーバーからバイトコードをASにいれてそれをgifやjpeg、png形式をよみわけてBitmap形式に手動でエンコードすることは、調べたかぎり難しそうです。
で、それを内部で自動化しているのがLoaderクラスということですね。うーん、すごい。
今回のASです。
package { import fl.controls.Button; import flash.display.Loader; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.net.URLRequest; public class CrossDomainImage extends Sprite { private var _url:String = "http://g-ec2.images-amazon.com/images/G/09/gno/images/orangeBlue/navAmazonLogoPrime._V11252456_.gif"; private var _loader:Loader; private var _button:Button; public function CrossDomainImage() { init(); } private function init():void { _button = new Button(); this.addChild(_button); _button.move(10, 10); _button.addEventListener(MouseEvent.CLICK, loadImage); _button.label = "ロード"; } private function loadImage(e:MouseEvent):void { if (_loader != null) { removeChild(_loader); } _loader = new Loader(); _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComp); _loader.load(new URLRequest(_url)); addChild(_loader); _loader.x = 10; _loader.y = 40; } private function loadComp(e:Event):void { _loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, loadComp); trace("load complete"); } } }
■ 自作iPhoneアプリ 好評発売中!
・フォルメモ - シンプルなフォルダつきメモ帳
・ジッピー電卓 - 消費税や割引もサクサク計算!
■ LINEスタンプ作りました!
毎日使える。とぼけたウサギ