2011-01-05 6 views
2

イメージを保存するときにイメージをロードすると、エフェクトが適用されません。私は何をすべきか?ここでフレックス:適用エフェクトを使用したmx:イメージの保存

はコードです:私はvar data:BitmapData = new BitmapData(currImg.width, currImg.width);保存した画像を使用していますように、新しい問題が出現

private var byteArr2:ByteArray; 
private var fileRef:FileReference = new FileReference(); 

public function process():void 
{ 
     var ct:ColorTransform = new ColorTransform(); 
     ct.redOffset = 99; 
     ct.blueOffset = 11; 
      ct.greenOffset = 22; 
      currImg.transform.colorTransform = ct; 
      callLater(toByteArray); 
} 

public function toByteArray():void 
{ 
     var data:BitmapData = new BitmapData(currImg.width, currImg.width); 
     data.draw(currImg);    
     var encod:JPEGEncoder = new JPEGEncoder(100);    
     byteArr2 = encod.encode(data); 
} 
public function saveFile():void 
{ 
     fileRef.save(byteArr2,"NewFileName1.jpg"); 
} 
<mx:HBox>  
     <mx:VBox>   
      <s:Button x="69" y="98" label="open" click="open()()"/> 
      <s:Button label="show" click="show()"/> 
      <s:Button label="process" click="process()"/> 
      <s:Button label="save" click="saveFile()"/> 
     </mx:VBox> 
     <mx:Image id="currImg" width="200" height="300"/> 
    </mx:HBox> 

UPDATEは(イメージコントロールのような大きさ)小さいですが、私は、元のサイズで画像を保存する必要があります。 var data:BitmapData = Bitmap(currImg.content).bitmapData;で動作しました

+1

+まあ表現の質問と優れたコードサンプル。残念ながら、私はあなたに答えがありません。 – JeffryHouser

答えて

3

私は、currImgの内容を使用するのではなく、新しいBitmapDataオブジェクトにコンポーネントを描画します。これは、変更されていないコンテンツではなく、画面上に描かれているものを提供するはずです。何かのように:

var data:BitmapData = new BitmapData(currImg.width, currImg.width); 
data.draw(currImg); 

希望に役立ちます。

+0

それは変ですが、問題は変わっていません – Sergey

+0

画像を更新して変換を反映させる前に画像を保存しているのだろうか? callLaterを使用して呼び出した別のメソッドで、画像を最初に更新する機会を与えるエンコード/保存を試みることができます。いいえ、ただのアイデア。 –

+0

サンプルコードですが、このアクションは別のメソッドにあります – Sergey

2

これは素晴らしい解決策ではありません。理由はわかりませんが、画像の周りにコンテナを置いて、描画の結果を保存すると動作するようです。

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> 
    <fx:Declarations> 
     <!-- Place non-visual elements (e.g., services, value objects) here --> 
    </fx:Declarations> 
    <fx:Script> 
     <![CDATA[ 
      import mx.graphics.codec.JPEGEncoder; 
      private var byteArr2:ByteArray; 
      private var fileRef:FileReference = new FileReference(); 

      public function process():void 
      { 
       var ct:ColorTransform = new ColorTransform(); 
       ct.redOffset = 99; 
       ct.blueOffset = 11; 
       ct.greenOffset = 22; 
       currImg.transform.colorTransform = ct; 
       callLater(toByteArray); 
      } 

      public function toByteArray():void 
      { 
       var data:BitmapData = new BitmapData(everything.width, everything.width); 
       data.draw(everything);    
       var encod:JPEGEncoder = new JPEGEncoder(100);    
       byteArr2 = encod.encode(data); 
      } 
      public function saveFile():void 
      { 
       fileRef.save(byteArr2,"NewFileName1.jpg"); 
      } 
     ]]> 
    </fx:Script> 
    <mx:HBox>  
     <mx:VBox>   
      <!--<s:Button x="69" y="98" label="open" click="open()"/>--> 
      <!--<s:Button label="show" click="show()"/> --> 
      <s:Button label="process" click="process()"/> 
      <s:Button label="save" click="saveFile()"/> 
     </mx:VBox> 
     <mx:Box id="everything"> 
      <mx:Image id="currImg" width="200" height="300" source="http://www.google.com/images/logos/ps_logo2.png"/> 
     </mx:Box> 
    </mx:HBox> 
</s:Application> 

ショーン

+0

hmmmなぜこれが機能するのですか) – Sergey

+1

私はまだ正確にはわかりませんが、画像の内容のビットマップデータの.colorTransform(rect、img)をラップする代わりに機能するように見えますが、どのような理由であれ、画像の変換にカラー変換が適用されても、イメージの子ではない独自のオブジェクトに何らかの形で終わってしまいます(ドキュメントの読み込みから、bitmapDataのピクセルを変更するだけですが、これが当てはまると思われる) – shaunhusain

関連する問題