2010-04-12 9 views
0

Я пытаюсь повторить эту функцию из графической библиотеки Allegro:Растяжение BitmapData в 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

Это довольно трудно в Flash, из-за перекрытия функциональных возможностей между прямоугольником и Matrix аргументы метода BitmapData.draw() AS3.

Это то, что у меня есть до сих пор. Он работает только в большинстве случаев и невероятно неэффективен (из-за необходимости дважды выбирать пиксели).

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); 
} 

Есть ли лучший способ сделать это?

ответ

1

Я думал, что 5-й параметр для рисования был источником rect, так что вы имеете в виду source_width и source_height?

В любом случае, попробуйте следующее:

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)); 
} 

И если вы используете перевернутую ось у (вспышка стиль у оси) удалить - от -source_y

0

Спасибо, но ничего не рисуется, когда я попробуйте использовать его. Я думаю, что это имеет какое-то отношение к тому, что x и y позиции clipRect смещаются по позиции Matrix. Если вы используете вместо этого:

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)); 
    } 

Тогда правильный клип исходного растрового изображения обращается в нужное значение X в «Dest», но при неправильном значении Y!

0

Хотя этот вопрос несколько старый, я думал, что опубликую рабочее решение. Это для двух общих объектов BitmapData, где sx, sy, sw и sh соответствуют источнику x, y, ширине и высоте соответственно.

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); 
}