2011-04-01 4 views
0

J'essaye d'enregistrer un composant en tant que fichier JPG et je n'arrive pas à obtenir le bitmapData.draw() pour me donner les pixels que j'attends et à la place je vois un rectangle blanc uni quand j'ouvre le résultat Fichier JPG. Je crée d'abord un objet qui contient une image et une légende (le MultigraphCanvas ci-dessous) et quand j'affiche l'objet comme un pop-up il semble parfait - cependant quand j'essaye de le dessiner comme un bitmap puis de l'encoder et l'enregistrer comme un JPG Je ne me retrouve pas avec la même image que je peux afficher sur l'écran. Voici le code:Flex BitmapData.draw() dessine uniquement un rectangle blanc - puis-je dessiner tous les éléments d'un objet d'affichage?

 private function saveAsFile(title:String):void 
     { 
      // make a canvas containing the multigraph and title 
      var multigraphCanvas:MultigraphCanvas = new MultigraphCanvas(); 
      multigraphCanvas.initialize(); 
      multigraphCanvas.multigraphGroup = multigraphGroup; 
      multigraphCanvas.titleText.text = title; 

      this.addElement(multigraphCanvas); 

      var matrix:Matrix = new Matrix() 
      matrix.tx = 0; 
      matrix.ty = 0; 
      var multigraphCanvasBitmapData:BitmapData = new BitmapData(multigraphCanvas.width, multigraphCanvas.height, true, 0xffffffff); 
      multigraphCanvasBitmapData.draw(multigraphCanvas, matrix); 
      var multigraphCanvasImage:Image = new Image(); 
      multigraphCanvasImage.load(new Bitmap(multigraphCanvasBitmapData)); 
      multigraphCanvasImage.content.width = multigraphCanvas.width; 
      multigraphCanvasImage.content.height = multigraphCanvas.height; 
      var multigraphCanvasImageBitmapData:BitmapData = new BitmapData(multigraphCanvas.width, multigraphCanvas.height, true, 0xffffffff); 
      multigraphCanvasImageBitmapData.draw(multigraphCanvasImage); 

      // DEBUGGING 
      PopUpManager.addPopUp(multigraphCanvas, this); 

      // DEBUGGING 
      var debugImage:Image = new Image(); 
      debugImage.source = multigraphCanvasImageBitmapData; 
      var debugTitleWindow:TitleWindow = new TitleWindow(); 
      debugTitleWindow.addElement(debugImage); 
      PopUpManager.addPopUp(debugTitleWindow, this); 

      // encode the canvas bitmap into a JPG byte array 
      var jpgEncoder:JPEGEncoder = new JPEGEncoder(85); 
      var jpgByteArray:ByteArray = jpgEncoder.encode(multigraphCanvasImageBitmapData); 

      // save the JPG byte array as a file 
      var fileReference:FileReference = new FileReference(); 
      fileReference.save(jpgByteArray, title + ".jpg"); 
     } 

Puis-je attendre la méthode BitmapData.draw() pour dessiner chaque composant de l'objet d'affichage il est passé, ou est-il rendu juste le plus élevé élément et aucun des enfants (ce que ça me ressemble)?

Répondre

0

Je crois que les composants doivent être dans l'arborescence d'affichage BitmapData.draw() pour être en mesure de les rendre.

+0

Comment les obtenir dans l'arborescence? Ajouter le composant en tant qu'enfant ou élément du composant qui est un objet affiché? –

0

J'ai été debout pendant les 24 dernières heures donc si la fonction est cassée ne me blâme pas :) Ceci est une version dépouillée d'une fonction que j'ai qui prend un instantané du conteneur (c1) et envoie au large du serveur. J'ai été codé en base64 car c'était ce que le gars Java voulait pour le back-end. Vous devrez masser le réglage pour vos besoins. J'ai coupé beaucoup de choses que j'avais dans cette fonction

private function getSnapShot(e:MouseEvent):String{ 
    var matrix:Matrix = new Matrix() 
    matrix.tx = 0; 
    matrix.ty = 0; 
    var finished1:BitmapData = new BitmapData(this.c1.width,this.c1.height,true,0xffffffff); 
    finished1.draw(this.c1, matrix ); 
    var myImage:Image = new Image(); 
    myImage.load(new Bitmap(finished1)); 
    myImage.content.width = this.c1.width; 
    myImage.content.height = this.c1.height; 
    var finished:BitmapData = new BitmapData(this.c1.width,this.c1.height,true,0xffffffff); 
    finished.draw(myImage); 
    myImage = null; 
    var encoder:JPEGEncoder = new JPEGEncoder(); 
    var data:ByteArray = encoder.encode(finished); 
    var b64:Base64Encoder = new Base64Encoder() 
    b64.encodeBytes(data) 
    return b64.toString(); 
} 

vous avez probablement seulement besoin de revenir « données » qui est le JPG

+0

Fondamentalement, vous devez créer un objet bitmapData à la taille que vous voulez. Ensuite, dessinez le récipient dedans. Puis chargez le bitMapData dans un objet image. Et enfin l'encoder comme vous voulez –

+0

oh ouais oublié que vous avez besoin de créer une deuxième bitMapData à partir de l'objet Image que vous venez de créer c'est la partie clé qui vous manque –

0

Vérifiez le point d'enregistrement du conteneur d'objets d'affichage de la source.

Imaginons le scénario suivant:

Le conteneur d'objets d'affichage contient un visuel comme un rectangle et ce DisplayObjectContainer a l'inscription en bas à gauche, donc pas de contenu est disponible en x, y = 1,1.

BitmapData.draw copiait le contenu à partir de 0,0 (si vous ne spécifiez pas autrement via une traduction de la matrice) de sorte que vous obtiendrez une zone blanche vide (ou la couleur de remplissage par défaut du BitmapData)

Questions connexes