2009-12-14 5 views
0

Je suis en train de prendre un instantané de la région masquée d'une image ... alors, je charge mon image puis effectuez les fonctions suivantes:BitmapData d'une image masquée dans ActionScript 3 (AS3)

private function manageLoadedImage(e:Event):void 
{ 

    _bitdata = e.currentTarget.content; // get the bitmap 

    _bithold.addChild(_bitdata); // add the bitmap to a sprite on the stage 

    _bithold.x = holder1.x -((_bithold.width - holder1.width)/2); // center image 

    _bithold.y = holder1.y -((_bithold.height - holder1.height)/2); // center image 

    var m:Shape = new Shape(); // create the shape 

    m.graphics.beginFill(0x0); // make the fill 

    m.graphics.drawRect(this.x, this.y, holder1.width, holder1.height); // draw the mask 

    m.graphics.endFill(); // end the fill 

    _bithold.mask = m; // mask the image 


}// private function manageNewPaneAddition(e:Event):void 

public function save():void 
{ 

          // WHAT DO I DO HERE ???????? 

    _bmdsrc = new BitmapData(holder1.width, holder1.height); // create the new bitmapdata 

    var m:Matrix = _bithold.transform.matrix; // lets try this out 

    m.tx = -holder1.x + _bithold.width; // not sure what this means ? 

    m.ty = -holder1.y + _bithold.height; // what does this mean ? 

    _bmdsrc.draw(_bithold, m); // draw the bitmapdata 

         // END PROBLEM ?????????????? 

}// private function save():void 

Donc, après avoir géré l'image chargée, je l'enregistre. Mais la fonction de sauvegarde produit seulement un carré blanc 80x80px. Cela me dit que je suis en train de photographier une scène vide.

La construction MovieClip est la suivante:

je un film, dans ce film, j'ai un nom d'éditeur de vignettes ThumbEdit.

ThumbEdit dispose d'un MovieClip sur son étage appelé "holder1". Dans la classe de document de ThumbEdit je crée un sprite "_bithold" et le place sur la scène chez holder1.x et holder1.y. Lorsque l'image se charge, j'ajoute l'image à _bithold, puis masque _bithold avec une forme. Donc, je veux prendre un instantané de la région masquée de _bithold mais je ne suis pas sûr de savoir comment je devrais faire ça ... un conseil?

Répondre

1

Vous pouvez essayer d'utiliser BitmapData.copyPixels().

0

J'ai décidé d'utiliser plutôt les MovieClips de la bibliothèque. J'ai créé un cadre avec un MovieClip masqué de la taille dont j'avais besoin à l'intérieur d'un MovieClip qui est sur la scène. Donc, sur la scène, j'ai le MovieClip nommé "Snap". Inside snap est deux couches, masque et support, les deux sont des clips Movieclips.

Lorsque l'image bitmap est chargée, je l'ajoute au clip movieclip qui est masqué de manière appropriée par la couche de masque. Ensuite, je prends un instantané du "Snap" MovieClip.

J'aurais probablement pu le trier par programme, mais c'était beaucoup plus rapide et très simple.

2

Il existe une approche pour réaliser ce dont vous avez besoin. Le plus simple est d'utiliser BitmapData avec Matrix classe, comme vous l'avez fait.

La méthode save semble correcte, sauf pour les références et peut-être que les coordonnées ne sont pas correctes. Votre méthode de sauvegarde devrait ressembler à cela, étant donné que _mask est la forme masquant le contenu et _bithold est le MovieClip masqué:

public function save():void 
{ 

    _bmp = new BitmapData(_mask.width, _mask.height); // creates the bitmap of the mask's size 

    var m:Matrix = new Matrix(); 
     m.translate(-_mask.x, -_mask.y); // Create the matrix used to translate the positions of the source image. 

    _bmp.draw(_bithold, m); // draw the bitmapdata considering the offset of the mask 


    addChild(new Bitmap(_bmp)); // just attaching the result on the screen, to see the result. 

} 

Il est important de noter que la ligne qui se traduit par l'objet de la matrice, doivent valeurs d'entrée parents au MovieClip _bithold. Cela signifie que si la forme du masque et l'objet masqué (_bithold) ne sont pas dans le même parent, vous devez apporter les coords au parent movieclip, avec les méthodes globalToLocal et localToGlobal.

Autre doute, je serai là!

Salutations, CaioToOn!

+0

cool! Merci pour l'aide. J'ai mis en place une solution de chronologie simple maintenant, mais j'essaierai la vôtre dans un proche avenir. Puis va poster ici. –

+0

Merci beaucoup! J'ai parcouru le web pour trouver une bonne solution à ce problème et cela fonctionne parfaitement. Brillant! – WendiKidd