2010-04-12 5 views
0

Je suis en train de reproduire cette fonction à partir de la bibliothèque graphique Allegro:Stretching BitmapData en AS3

void stretch_blit(BITMAP *source, BITMAP *dest, int source_x, 
        int source_y, int source_width, int source_height, 
        int dest_x, dest_y, dest_width, dest_height); 

http://www.allegro.cc/manual/api/blitting-and-sprites/stretch_blit

Ceci est un peu difficile en Flash, en raison de la fonctionnalité de chevauchement entre le rectangle et matrice arguments de la méthode BitmapData.draw() d'AS3.

C'est ce que j'ai jusqu'à présent. Cela ne fonctionne que la plupart du temps et est incroyablement inefficace (en raison de devoir échantillonner les pixels deux fois).

function stretch_blit(src:BitmapData, dest:BitmapData, source_x:int, source_y:int, 
    source_width:int, source_height:int, dest_x:int, dest_y:int, 
    dest_width:int, dest_height:int):void { 
    var tmp:BitmapData = new BitmapData(dest_width, dest_height, true); 
    var scalex:Number = dest_width/source_width; 
    var scaley:Number = dest_height/source_height; 
    var matrix:Matrix = new Matrix(); 
    var matrix2:Matrix = new Matrix(); 
    matrix.scale(scalex, scaley); 
    matrix.translate(source_x, -source_y); 
    tmp.draw(src, matrix, null, null, new Rectangle(0, 0, dest_width, dest_height)); 
    matrix2.translate(dest_x-source_x, dest_y-source_y); 
    dest.draw(tmp, matrix2); 
} 

Y a-t-il une meilleure façon de procéder?

Répondre

1

Je pensais que le 5ème paramètre à dessiner était le rectangle source, alors voulez-vous dire source_width et source_height?

Quoi qu'il en soit, essayez ceci:

function stretch_blit(src:BitmapData, dest:BitmapData, source_x:int, source_y:int, 
source_width:int, source_height:int, dest_x:int, dest_y:int, dest_width:int, dest_height:int):void { 
    var scalex:Number = dest_width/source_width; 
    var scaley:Number = dest_height/source_height; 
    var matrix:Matrix = new Matrix(); 
    matrix.scale(scalex, scaley); 
    matrix.translate(dest_x, dest_y); 
    dest.draw(src, matrix, null, null, new Rectangle(source_x, -source_y, source_width, source_height)); 
} 

Et si vous utilisez l'axe y inversé (le style flash axe y) retirer le - de -source_y

0

Merci, mais rien est tiré quand je essayez de l'utiliser. Je pense que cela a quelque chose à voir avec la position x et y du clipRect étant décalée par la position de la matrice. Si vous utilisez ceci:

function stretch_blit(src:BitmapData, dest:BitmapData, source_x:int, source_y:int, 
    source_width:int, source_height:int, dest_x:int, dest_y:int, dest_width:int, dest_height:int):void { 
     var scalex:Number = dest_width/source_width; 
     var scaley:Number = dest_height/source_height; 
     var matrix:Matrix = new Matrix(); 
     matrix.scale(scalex, scaley); 
     matrix.translate(dest_x, dest_y); 
     dest.draw(src, matrix, null, null, new Rectangle(source_x+dest_x, source_y+dest_y, source_width, source_height)); 
    } 

ensuite le clip correct du bitmap source est tirée, à droite valeur X « dest », mais à la mauvaise valeur Y!

0

Bien que cette question soit un peu ancienne, j'ai pensé que je posterais une solution de travail. Ceci est valable pour deux objets BitmapData génériques, où sx, sy, sw et sh désignent respectivement la source x, y, la largeur et la hauteur.

function drawImage(src:BitmapData, dest:BitmapData, sx:int, sy:int, sw:int, sh:int, dx:int, dy:int, dw:int, dh:int):void 
{ 
    var scaleX:Number = dw/sw, scaleY:Number = dh/sh; 
    var m:Matrix = new Matrix(); 
    m.scale(scaleX, scaleY); 
    m.translate(dx, dy); 
    var temp:BitmapData = new BitmapData(sw, sh, src.transparent, 0); 
    temp.copyPixels(src, new Rectangle(sx, sy, sw, sh), new Point()); 
    dest.draw(temp, m); 
}