Flex の画像の扱い

画像のロードと Bitmap オブジェクト
Flex で画像を扱いたい場合、埋め込むか外部からロードするかですが、
処理の仕方は違いますが、取り込まれた画像の基本的な扱いは Bitmap オブジェクトです
まず、上記定義で imgSmile は、クラスとして定義されていますが、
これは、Bitmap クラスのサブクラスで、インスタンスを作成
すると、bitmapData プロパティに smile.png のデータがセットされます。
つまり、img:Bitmap = new imgSmile(); です。
また、loader:Loader = new Loader(); で作成された loader オブジェクトは
content プロパティを持ちますが、これは Bitmap オブジェクトです。

つまり、以下の実行が可能です
Bitmap(img.content).bitmapData = Bitmap(loader.content).bitmapData;
Bitmap オブジェクトは、実体としての BitmapData オブジェクトの容器であり、
別のBitmap オブジェクトが、同じ BitmapData オブジェクトを参照する事もできます。

imgSmile の 新しいインスタンスはそれぞれ別々の BitmapData オブジェクト
を持ちます。BitmapData.clone() で複製も可能で、廃棄は BitmapData で
dispose します。
Image オブジェクトの プロパティである source プロパティや、
WindowedApplication の titleIcon プロパティは特殊なプロパティで、
Flex の仕様の元、変換可能な記述を自動的に Bitmap オブジェクトに変換
してくれます
01.    // *********************************************************  
02.    // 単純な Image Class の処理  
03.    // *********************************************************  
04.    public function Action2():void {  
05.   
06.//      img2.addChild( smile );  
07.//      img2.source = "http://localhost/php/smile.png";  
08.//      img2.source = "c:\\tmp\\smile.png";  
09.//      img2.source = "smile.png";  
10.//      img2.source = smile;  
11.//      img2.source = imgSmile;  
12.        Bitmap(img2.content).bitmapData = smile.bitmapData;  
13.   
14.    }  
上記の 7 つの処理は同じ結果になります。
( addChild は、見た目に関して同じ )


また、Sprite オブジェクトより継承された表示オブジェクトには、
graphics プロパティがあり、これを使用して、BitmapData オブジェクトを
描画する事も可能です。

※ 複数の別々の画像を重ねるのには向いていません、
※ そのような場合は、別々のオブジェクトを作成してコンテナに追加します
1.// Image オブジェクトに対する描画
2.// ( 対象が大きければ繰り返し描画されます )
3.img.graphics.beginBitmapFill( smile.bitmapData );  
4.img.graphics.drawRect(0, 0, smile.width, smile.height);
5.img.graphics.endFill();
特殊な描画としては、Flash としてのルートとなる描画エリアである
stage に対しては、Bitmap オブジェクトを直接追加可能です。

この場合はこのページの先頭の画像のように、タイトルエリアを無視した
表示が可能になります。また、逆に言えば、 stage に対しては、
mx.* コントロールを追加しても表示される事はありません。
( Bitmap オブジェクトを追加する必要があります )


テスト用のソースコード
001.<?xml version="1.0" encoding="utf-8"?>
002.<mx:WindowedApplication
003.    xmlns:mx="http://www.adobe.com/2006/mxml"
004.    initialize="initData();"
005. 
006.    usePreloader="true"
007. 
008.    headerHeight="80"
009.    cornerRadius="20"
010.    titleTextStyleName="titleStyle"
011.    layout="absolute"
012.>
013. 
014.<mx:Style>
015.WindowedApplication {
016.    backgroundGradientColors: 0,9044009;
017.}
018..titleStyle {
019.    fontSize: 12;
020.}
021.</mx:Style>
022. 
023.<mx:Script>
024.<![CDATA[
025. 
026.    [Bindable]
027.    [Embed("smile.png")]
028.    private var imgSmile:Class;
029. 
030.    private var loader:Loader = new Loader();
031.    private var smile:Bitmap = new imgSmile();
032. 
033.    // *********************************************************
034.    // アプリケーションの初期化
035.    // *********************************************************
036.    public function initData():void {
037. 
038.        img.source = new Bitmap();
039.        img2.source = new Bitmap();
040. 
041.    }
042. 
043.    // *********************************************************
044.    // Loader による画像取得
045.    // *********************************************************
046.    public function Action1():void {
047. 
048.        // 読み込み完了イベントを登録
049.        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);
050. 
051.        // 読み込み
052.        loader.load(new URLRequest("http://localhost/php/smile.png"));
053.//      loader.load(new URLRequest("smile.png"));
054.//      loader.load(new URLRequest("c:\\tmp\\smile.png"));
055. 
056.    }
057. 
058.    // *********************************************************
059.    // 読み込み完了イベント
060.    // *********************************************************
061.    private function loadComplete(e:Event):void {
062. 
063.        // target は、LoaderInfo
064. 
065.//      img.addChild( e.target.loader );
066.//      img.addChild( loader.content );
067.//      img.addChild( loader );
068.//      img.source = e.target.content;
069.//      img.source = loader.content;
070.//      img.source = loader;
071.//      Bitmap(img.content).bitmapData = e.target.content.bitmapData;
072.        Bitmap(img.content).bitmapData = Bitmap(loader.content).bitmapData;
073. 
074.    }
075. 
076.    // *********************************************************
077.    // 単純な Image Class の処理
078.    // *********************************************************
079.    public function Action2():void {
080. 
081.//      img2.addChild( smile );
082.//      img2.source = "http://localhost/php/smile.png";
083.//      img2.source = "c:\\tmp\\smile.png";
084.//      img2.source = "smile.png";
085.//      img2.source = smile;
086.//      img2.source = imgSmile;
087.        Bitmap(img2.content).bitmapData = smile.bitmapData;
088. 
089.    }
090. 
091. 
092.    // *********************************************************
093.    // 少し特殊な画像描画
094.    // *********************************************************
095.    public function Action3():void {
096. 
097.        // mx を無視した flash 全体への描画
098.        stage.addChild( smile );
099. 
100.        // Image Class の source プロパティと同じ
101.        titleIcon = imgSmile;
102. 
103.        // mx ルートコンテナへの追加
104.//      var mxImg:Image = new Image();
105.//      mxImg.source = "smile.png";
106.//      addChild(mxImg);
107. 
108.        // Image オブジェクトに対する描画
109.        // ( 対象が大きければ繰り返し描画されます )
110.        img.graphics.beginBitmapFill( smile.bitmapData );  
111.        img.graphics.drawRect(0, 0, smile.width, smile.height);
112.        img.graphics.endFill();
113. 
114. 
115.    }
116. 
117.]]>
118.</mx:Script>
119. 
120.<mx:Image
121.    id="img"
122.    x="0"
123.    y="0"
124./>
125.<mx:Image
126.    id="img2"
127.    x="100"
128.    y="0"
129./>
130. 
131.    <mx:Button
132.        x="150"
133.        y="150"
134.        label="画像テスト1"
135.        click="Action1();"
136.    />
137.     
138.    <mx:Button
139.        x="150"
140.        y="200"
141.        label="画像テスト2"
142.        click="Action2();"
143.    />
144. 
145.    <mx:Button
146.        x="150"
147.        y="250"
148.        label="画像テスト3"
149.        click="Action3();"
150.    />
151. 
152.</mx:WindowedApplication>