2010-07-28 3 views
0

J'essaie de prendre des images que je place dans un composant canevas flex vers un bitmap. J'ai été en mesure d'arriver au point où je ne reçois pas d'erreur, mais aucune image ne s'affiche et l'image que j'enregistre en jpg est vide. J'imagine que je ne mets pas les données bitmap correctement mais ne peux pas comprendre ce que je fais mal.Conversion d'un composant flex w/images en bitmap

Voici le code où je suis le convertir en une image bitmap:

var imageSnap:ImageSnapshot = ImageSnapshot.captureImage(_renderPop); 
    var imageByteArray:ByteArray = imageSnap.data as ByteArray; 
    var bLoader:Loader = new Loader(); 
    bLoader.loadBytes(imageByteArray); 

    var bmd:BitmapData = new BitmapData(500,500); 
    bmd.draw(bLoader); 

    var imgTest:Image = new Image(); 
    imgTest.source = bmd; 
    _renderPop.renderCanvas.addChild(imgTest); 



    var fileRef:FileReference = new FileReference(); 
    fileRef.save(bLoader, 'testImage.jpg'); 

_renderPop.renderCanvas est où je mettais les images. Quelqu'un voit-il quelque chose de mal?

Répondre

0

Dans votre code:

var bLoader:Loader = new Loader(); 
bLoader.loadBytes(imageByteArray); 

... vous en supposant que les octets sont chargés immédiatement; essayez de mettre un écouteur d'événement sur le chargeur comme suit:

bLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler); 

private function completeHandler(event:Event):void 
{ 
    // ... the rest of your code goes here 
} 

Les loadBytes fonctions fonctionne comme la fonction de charge en ce sens qu'ils sont à la fois des processus asynchrones de sorte que vous aurez besoin de l'écouteur d'événement. C'est un peu contre-intuitif, et j'ai fait la même erreur moi-même plusieurs fois.

Si cela ne fonctionne, peut-être laisser le contentLoaderInfo propriété, mais devrait travailler dessus ...

Permettez-moi pas si vous venez juste :)

+0

OK merci, donc cela semble aller un peu plus loin. Mais maintenant je reçois une erreur bitmapdata invalide. Voyez-vous autre chose que je devrais faire pour capturer les bitmapdata correctement? – pfunc

+0

Juste pour clarifier, je reçois l'erreur bitmapdata invalide sur cette ligne: var imageSnap: ImageSnapshot = ImageSnapshot.captureImage (_renderPop.renderCanvas, 150); Si j'utilise juste _renderPop alors je ne reçois pas d'erreur, mais j'obtiens un bitmapImage vide. _renderPop.renderCanvas est un objet mx: Canvas. Je peux le retracer, il est là. – pfunc

+0

Quelle est exactement cette classe ImageSnapshot que vous utilisez? Au lieu d'utiliser ce composant, essayez de le faire manuellement ... Il y a un article de blog très intéressant sur InsideRIA pour faire cela (et beaucoup plus!) http://insideria.com/2008/03/image-manipulation-in -flex.html Cela aide-t-il du tout? – infomaniac

1

Votre code « loader » est faux. Juste après capture d'image, vous pouvez à la fois sauvegarder les données avec FileReference:

var imageSnap:ImageSnapshot = ImageSnapshot.captureImage(_renderPop); 
var fileRef:FileReference = new FileReference();  
fileRef.save(imageSnap.data, 'testImage.png'); 

Ce imageSnap ne contient pas BitmapData mais octets d'image png. Pour montrer l'image que vous devez capturer BitmapData mais pas l'image et créer Bitmap à partir des données bitmap:

var bmd:BitmapData = ImageSnapshot.captureBitmapData(_renderPop); 
var imgTest:Image = new Image(); 
imgTest.source = new Bitmap(bmd); 
_renderPop.renderCanvas.addChild(imgTest); 

En résultat localement testImage.png est créé sur le système de fichiers et il est représenté sur la toile. Si vous avez besoin de jpg, vous devez spécifier:

var imageSnap:ImageSnapshot = ImageSnapshot.captureImage(_renderPop, 0, new JPEGEncoder()); 
Questions connexes