2011-01-05 13 views
2

Ich lade Bild zu steuern, als ich einige Effekte anwende, und wenn ich Bild speichere, wird es ohne Effekte gespeichert. Was soll ich machen? HierFlex: Speichern von mx: Bild mit angewendeten Effekten

ist der Code:

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 neues Problem erscheint als ich var data:BitmapData = new BitmapData(currImg.width, currImg.width); gespeicherte Bild bin mit klein (Größe wie Bildkontrolle), aber ich brauche Bild speichern mit Originalgröße. Mit var data:BitmapData = Bitmap(currImg.content).bitmapData; hat es funktioniert

+1

+ Gut formulierte Frage und ein gutes Codebeispiel. Leider habe ich keine Antwort für dich. – JeffryHouser

Antwort

3

Ich würde die Komponente in ein neues BitmapData-Objekt zeichnen, anstatt den Inhalt der Währung zu verwenden. Dies sollte Ihnen zeigen, was auf dem Bildschirm gezeichnet wird, anstatt den unveränderten Inhalt. Etwas wie so:

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

Hoffnung, die hilft.

+0

Es ist seltsam, aber das Problem bleibt gleich – Sergey

+0

Hmm, ich frage mich, ob es ist, weil Sie das Bild speichern, bevor das Bild aktualisiert wird, um die Transformation zu reflektieren? Sie könnten versuchen, in einer separaten Methode, die Sie mit callLater aufrufen, zu codieren/speichern, was dem Bild die Möglichkeit geben würde, es zuerst zu aktualisieren. Keine Garantien, nur eine Idee. –

+0

es ist nur Beispielcode, in der Vollversion sind diese Aktionen in separaten Methoden – Sergey

2

In Ordnung, das ist keine großartige Lösung, weil ich nicht weiß, warum es funktioniert, aber wenn Sie einen Container um das Bild legen, dann speichern Sie die Ergebnisse der Zeichnung, die es zu funktionieren scheint.

<?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> 

Shaun

+0

hmmm und warum funktioniert das?) – Sergey

+1

Ich bin immer noch nicht sicher, aber es scheint, dass Aufruf .colorTransform (rect, img) auf den Bitmap-Daten des Inhalts des Bildes funktioniert auch, anstatt es zu wickeln, aber es erscheint für Aus welchem ​​Grund auch immer, wenn die Farbtransformation auf die Transformation des Bildes angewendet wird, endet sie irgendwie in ihrem eigenen Objekt, das kein Kind des Bildes ist (aus der Dokumentation liest es sich, als würde es nur die Pixel der BitmapDaten verändern, aber das tut es nicht Wenn das nicht der Fall ist, – shaunhusain